結論

丸数字(①)は、日本語入力で「まるいち」や数字の「1」「21」を入力して変換すると出せます。①〜⑳は Windows の文字コード(cp932)では使えますが、Shift_JIS・ISO-2022-JP・EUC-JP では表せず、㉑〜㊿は UTF-8 などの Unicode でしか送れません。「機種依存文字だから使えない」のではなく、「保存・送信に使う文字コードに入っているか」で決まります。

この記事でわかること

  • 丸数字の出し方(Windows・Mac・iPhone・Android・Linux)と、21〜50・51以上の扱い
  • 文字コードごとに①〜㊿が使えるかを Python・Java で数えた表と、化けたときの原文
  • メール・CSV・zip のファイル名・Webフォームで丸数字を使ってよいかの判断表

2026年10月29日更新|Python 3.13・OpenJDK 21・Chromium 153・Mozc 2.28・iconv(glibc 2.39)・UnZip 6.00で実行確認

この記事で実際に動かしたもの:Ubuntu 24.04 の上で、日本語入力 Mozc 2.28(.deb を作業場所に展開し、変換エンジンに読みを送って候補を取り出した)、Python 3.13 の文字コード変換・email・csv・zipfile、OpenJDK 21 の getBytes、glibc の iconv、UnZip 6.00、127.0.0.1 に立てた自分のページを開いた Chromium 153 です。

flowchart TD
    A["①を入力"] --> B{"保存・送信の<br>文字コード"}
    B -->|"UTF-8"| C["①のまま"]
    B -->|"cp932"| D{"受け手も<br>cp932?"}
    D -->|"はい"| C
    D -->|"いいえ"| E["エラー<br>化け"]
    B -->|"Shift_JIS<br>ISO-2022-JP"| F["失敗か<br>?に置換"]

やりたいことごとに、いちばん早い方法を先にまとめます。

やりたいこと いちばん早い方法 詳しい節
丸数字の出し方(①〜⑳) 「まるいち」または「1」と入力して変換候補から選ぶ 丸数字の出し方(パソコン・スマホ別)
21以上の丸数字(㉑〜㊿) 「21」〜「50」の数字を入力して変換する 21以上の丸数字の出し方
51以上の丸数字 1文字の丸数字は無い。(51) などで代える 21以上の丸数字の出し方
丸数字をコピペしたい 本記事の一覧表からコピーする 丸数字の一覧とUnicodeの範囲
丸数字は機種依存文字か ①〜⑳は今は規格に入っている。送る文字コード次第 機種依存文字とは
メールで丸数字が化けた 本文を UTF-8 で送る。ISO-2022-JP なら (1) に書き換える メールで丸数字が化ける例
CSVで丸数字が消えた・?になった 読み書きの指定を cp932 か UTF-8 にそろえる CSVで丸数字が化ける・消える例
使ってよいか迷う 相手と経路の文字コードで決める 丸数字を使ってよい場面の判断表

確認環境:Ubuntu 24.04.5 LTS(2 CPU)。日本語入力は Ubuntu の mozc-server・emacs-mozc-bin 2.28.4715.102(Google 日本語入力のオープンソース版)を apt-get download で取得して作業場所に展開し、自分のマウント名前空間の中で一般ユーザーとして起動、mozc_emacs_helper で「m・a・r・u」などのキーを送り、変換候補の一覧を取り出しました。文字コードは Python 3.13.18(unicodedata 15.1.0)の codecs・email・csv・zipfile、OpenJDK 21.0.12 の String.getBytes と CharsetEncoder、iconv(Ubuntu GLIBC 2.39)、UnZip 6.00(Debian)で確かめ、Web は 127.0.0.1 の 18207 番ポートに Python の http.server で置いた自分のページを Chromium 153.0.8010.12(Playwright 1.63.0)で開いて、表示・TextDecoder・フォーム送信を記録しました。フォントは Noto Sans CJK JP ほか、この環境に入っている163ファミリーです。Windows・Mac・iPhone・Android の入力方法は Microsoft・Apple・Google(android.com)の公式ページで確かめた範囲だけを書き、Microsoft IME の変換候補の順番は手元で動かせないため扱っていません。符号の範囲は Unicode のコード表、ブラウザーの解釈は WHATWG Encoding Standard で確かめました(確認日 2026年10月29日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「丸数字(①)の出し方|21以上と機種依存文字で化ける原因を実測」

丸数字とは(①は「1」と丸を重ねたものではなく1文字)

この節では、丸数字がどんな文字か、ふだんの使い方とコンピューターの中での扱いの違いが分かります。

丸数字は、①のように数字を丸で囲んだ記号で、コンピューターの中では「1」とは別の、独立した1文字として番号(コードポイント)が割り当てられています。 ①は Unicode の U+2460(CIRCLED DIGIT ONE)、⑳は U+2473、㉑は U+3251、㊿は U+32BF です。文書では手順・設問・箇条書きの番号としてよく使われます。

観点 ふだんの意味 IT・プログラミングでの意味
丸数字 手順・設問の番号に使う記号 「1」とは別の1文字。U+2460 などの番号を持つ
①の「数字らしさ」 1番目を表す 数値ではない。int('①') は ValueError
機種依存文字 特定のパソコンでしか出ない字 使う文字コード(cp932・Shift_JIS など)に入っていない字
化ける 字が別の字や記号に変わる 書いた側と読む側で文字コードが違う、または表せない字が ? に置き換わる

Python で文字の情報を引くと、丸数字は「数字(Nd)」ではなく「その他の数字(No)」に分類されていました。

文字  分類  numeric  NFKCで正規化
①    No    1.0      '1'
⑩    No    10.0     '10'
㉑    No    21.0     '21'
㊿    No    50.0     '50'
⓪    No    0.0      '0'
❶    No    1.0      '❶'
1     Nd    1.0      '1'

丸数字は「数を表す記号」ではあっても「計算に使う数字」ではない、という点が、後の節で出てくるプログラムのつまずきの元になります。

丸数字の出し方(パソコン・スマホ別)

この節では、Windows・Mac・iPhone・Android・Linux それぞれで丸数字を入力する方法が分かります。

どの端末でも、いちばん早いのは日本語入力の変換です。「まるいち」と読みを入れるか、数字の「1」を入れて変換キー(スペース)を押し、候補から①を選びます。 変換で見つからないときは、記号の一覧(Windows の IME パッドや絵文字パネル、Mac の文字ビューア)から選ぶか、よく使うならユーザー辞書に登録します。

端末 変換で出す 一覧から選ぶ・登録する 出典
Windows 読み・数字を入れて変換 IME のメニューから IME パッドを開く。Windows キー+ピリオド(.)で絵文字パネル Microsoft サポート
Windows の Word 同上 「2460」と入力して Alt+X で①に変わる Microsoft サポート(Word)
Mac 読み・数字を入れて変換 Fn+E(または地球儀キー+E)か「編集」>「絵文字と記号」で文字ビューアを開き、検索する Apple サポート
iPhone 読み・数字を入れて変換 ユーザ辞書に登録すると、その読みで候補に出る Apple サポート
Android(Gboard) 「きごう」と入力して変換すると特殊記号が候補に出る 設定の「単語リスト」から読みを付けて登録 android.com
Linux(Mozc) 「まるいち」「1」「21」で変換 端末なら printf '①' 本記事で実行

Windows

1

読みか数字を入れて変換する

日本語入力をオンにして「まるいち」や「1」と入れ、スペース(変換)を押して候補から①を選ぶ。候補の順番は IME と学習の状態で変わる。

①〜⑳・㉑〜㊿

2

IME パッドか絵文字パネルを開く

Microsoft のサポートページでは、IME のメニューで「IME パッド」を選ぶと開けると案内されています。キーボードのショートカット一覧では、Windows キー+ピリオド(.)またはセミコロン(;)が「絵文字パネルを開きます」とされています。

変換で見つからないとき

3

Word では番号から入れる

Word では、Unicode の番号(16進数)を入力して Alt+X を押すと記号に変わります(Microsoft の Word 向け説明)。①は 2460、㉑は 3251、㊿は 32BF。

Word for Microsoft 365・2016〜2024

Mac

Apple の「Macで絵文字と記号を使用する」では、Fn+E キーまたは地球儀キー+E キーを押すか、「編集」>「絵文字と記号」と選ぶと文字ビューアが開き、検索フィールドに語句を入れて探し、クリックで文字を入れられると案内されています。変換で出ないときや、❶(黒丸)・⓵(二重丸)のような種類を選びたいときに使います。

iPhone・Android

スマホも、読みや数字を入れて変換候補から選ぶのが基本です。Apple の iPhone ユーザガイドには「ユーザ辞書に単語を登録しておくと、そのよみを入力した際に登録した単語が変換候補に表示されます」とあり、①〜⑤を「まる1」などの読みで登録しておくと手早く出せます。Android の Gboard は、android.com の解説で「きごう」と入力して変換すると特殊文字や特殊記号が変換候補に出ること、設定の[単語リスト]から読みを付けて単語を登録できることが案内されています。

Linux(端末とプログラム)

端末やプログラムでは、文字の番号から直接作れます。bash の printf は UTF-8 のロケールで \u の番号を文字にしました。

$ LC_ALL=C.UTF-8 bash -c "printf '① ㉑ ㊿\n'"
① ㉑ ㊿
$ python3 -c "print(''.join(chr(0x2460 + i) for i in range(20)))"
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳

変換候補を日本語入力(Mozc)で確かめた結果

どんな読みを入れると丸数字が候補に出るのかを、実際の日本語入力に読みを送って確かめました。

Mozc では「まる」だけでは丸数字は候補に出ず、「まるいち」「まるに」「まるじゅう」のように数まで読むと、5番目前後に①・②・⑩が出ました。 数字の「1」「21」「50」を入れて変換した場合も候補に入り、51では出ませんでした。Mozc は Google 日本語入力のオープンソース版で、ここで分かるのはその辞書の傾向です。Microsoft IME・Apple の日本語入力の候補の順番は、同じとは限りません。

読みをローマ字で1文字ずつ送り、スペースで変換した直後の候補一覧から、丸数字・黒丸数字などを抜き出しました(左の数字が候補の順位)。

読み         候補の数  丸数字が出た位置
まる          41件     18:Ⓜ(丸数字は無し)
まるいち      18件     5:① 6:❶ 7:➀ 8:➊
まるに        15件     5:② 6:❷ 7:➁ 8:➋
まるじゅう    15件     4:⑩ 5:❿ 6:➉ 7:➓
いち          34件     12:①
じゅう        63件     17:⑩
にじゅう      24件     14:⑳
にじゅういち   9件     (無し)
1             10件     5:¹ 6:₁ 10:①
20            13件     7:⑳
21            15件     7:㉑
50            12件     6:㊿
51            13件     (無し)
0              7件     5:⁰ 6:₀(⓪は無し)
きごう        384件    140:① 141:② … 159:⑳ 160:㉑ …

1「まる+数の読み」が早い

まるいち・まるに・まるじゅうは、どれも4〜5番目に丸数字が出た。黒丸の❶や Dingbats の➀も並ぶので、形を見て選ぶ。

221以上は数字で入れる

「にじゅういち」では㉑が出ず、半角の「21」で出た。21〜50は数字を入れて変換するのが確実だった。

3「きごう」は最後の手段

候補は384件で、①は140番目。一覧から選べるが、目で探す量が多い。

21以上の丸数字(㉑〜㊿)の出し方と51以上の扱い

この節では、21〜50の丸数字の出し方と、51以上が1文字で出せない理由が分かります。

㉑〜㊿は「21」〜「50」を入力して変換すると出せます。51以上の丸数字は Unicode に1文字として定められていないため、どの端末でも1文字では出せません。

Unicode では、①〜⑳が U+2460〜U+2473(Enclosed Alphanumerics)、㉑〜㉟が U+3251〜U+325F、㊱〜㊿が U+32B1〜U+32BF(Enclosed CJK Letters and Months)に分かれて入っています。21〜35と36〜50が離れているのは、追加された時期と場所が違うためで、プログラムで番号を計算するときは3つの範囲を分けて扱います。

def maru(n):
    if 1 <= n <= 20:
        return chr(0x2460 + n - 1)
    if 21 <= n <= 35:
        return chr(0x3251 + n - 21)
    if 36 <= n <= 50:
        return chr(0x32B1 + n - 36)
    if n == 0:
        return chr(0x24EA)
    return f'({n})'   # 51以上は1文字の丸数字が無い

print([maru(n) for n in (0, 1, 20, 21, 35, 36, 50, 51)])
['⓪', '①', '⑳', '㉑', '㉟', '㊱', '㊿', '(51)']

51以上を丸で囲みたいときは、ワープロの「囲い文字」のような装飾で見た目を作る方法があります。ただし、その場合は文字としては「51」と丸の図形の組み合わせなので、ほかのソフトへコピーすると丸が外れることがあります。文書の番号なら「(51)」「51.」に切り替えるほうが崩れません。

51以上を丸数字で書きたいとき

避けたい①〜㊿と、装飾で作った51以上を同じ一覧に混ぜる。コピーや検索で番号が途切れる
→
代わりに項目が50を超えそうなら、最初から (1)・1. の番号に統一する

見分ける問い:「この一覧は50項目を超えるか」

丸数字の一覧とUnicodeの範囲(コピペ用)

この節では、丸数字の種類と Unicode の番号、コピーして使える一覧が分かります。

「丸数字」と呼ばれる文字は、白抜きの①系だけでなく、黒丸の❶系、二重丸の⓵系、欧文フォント由来の➀系があり、文字コードへの入り方がそれぞれ違います。

種類 文字(コピペ用) Unicode cp932
丸数字 1〜20 ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ U+2460〜2473 ○(20/20)
丸数字 21〜35 ㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟ U+3251〜325F ×
丸数字 36〜50 ㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿ U+32B1〜32BF ×
丸数字 0 ⓪ U+24EA ×
黒丸数字 1〜10 ❶❷❸❹❺❻❼❽❾❿ U+2776〜277F ×
黒丸数字 11〜20 ⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴ U+24EB〜24F4 ×
二重丸数字 1〜10 ⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾ U+24F5〜24FE ×
欧文の丸数字 1〜10 ➀➁➂➃➄➅➆➇➈➉ U+2780〜2789 ×

HTML に書くときは、数値文字参照 &#9312;(10進)や &#x2460;(16進)でも同じ①になります。Chromium で &#9312;&#x2473;&#12881;&#12991; を表示すると「①⑳㉑㊿」と出ました。

機種依存文字とは(丸数字が化けると言われる理由)

この節では、機種依存文字の意味と、丸数字がその代表として扱われてきた経緯が分かります。

機種依存文字とは、規格に定められていない、メーカーが独自に番号を割り当てた文字のことです。 総務省 東海総合通信局のウェブアクセシビリティの解説では「JISやISOなどの規格に定義されておらず、メーカーが独自に定義した文字のことで、特定の機種でしか正しく表示することができません」と説明され、丸付き数字が代表例に挙がっています。

丸数字は、日本語の文字の規格 JIS X 0208 には入っておらず、NEC のパソコンは①〜⑳を独自の番号で、Mac は別の番号で持っていました。このため、Windows で書いた①が Mac で別の字に見える、ということが実際に起きていました。その後、2000年の JIS X 0213 で①〜㊿などが規格に入り、Unicode にも収録されたので、今は「機種」よりも「どの文字コードで保存・送信するか」で使えるかどうかが決まります。

以前(機種ごとの独自の番号)

NEC・Mac で番号が違う

別の機種で開くと別の字になる

「機種依存文字は使わない」が決まりごとになった

今(文字コードで決まる)

UTF-8 なら①〜㊿をどの端末でも表せる

cp932 は①〜⑳だけ、Shift_JIS・ISO-2022-JP は0個

化けるのは、経路のどこかが表せない文字コードのとき

なお、同じ「機種依存文字」の仲間として、ローマ数字(Ⅰ)や㈱・㎝なども挙げられます。手元で確かめると、Ⅰと㈱も cp932 では表せ、Shift_JIS では表せませんでした。理由は丸数字と同じです。

Shift_JIS・cp932・UTF-8で丸数字が使えるか(実測表)

この節では、文字コードごとに丸数字が何文字表せるかを、Python で数えた結果が分かります。

①〜⑳を表せたのは cp932 と shift_jis_2004(JIS X 0213)だけで、Shift_JIS・EUC-JP・ISO-2022-JP は0個でした。㉑〜㊿は cp932 でも表せません。 UTF-8 は表のすべてを表せます。

for cp in range(0x2460, 0x2474):          # ①〜⑳
    for enc in ['shift_jis', 'cp932', 'shift_jis_2004', 'euc_jp', 'iso2022_jp']:
        try:
            chr(cp).encode(enc)            # 表せれば数える
        except UnicodeEncodeError:
            pass                           # 表せない
範囲 Shift_JIS cp932 shift_jis_2004 EUC-JP・ISO-2022-JP
①〜⑳(20字) 0 20 20 0
㉑〜㉟(15字) 0 0 15 0
㊱〜㊿(15字) 0 0 15 0
⓪(1字) 0 0 0 0
❶〜❿・⓫〜⓴(20字) 0 0 20 0
⓵〜⓾(10字) 0 0 10 0
➀〜➓(20字) 0 0 0 0

1文字ずつのバイト列は次のとおりでした(× は表せない)。cp932 の①は 87 40 で、JIS X 0213 系の shift_jis_2004 でも同じ 87 40 になりました。

文字 cp932 shift_jis_2004 iso2022_jp_2004 UTF-8
① 87 40 87 40 1B 24 28 51 2D 21 … E2 91 A0
⑳ 87 53 87 53 1B 24 28 51 2D 34 … E2 91 B3
㉑ × 84 BF 1B 24 28 51 28 41 … E3 89 91
㊿ × 84 DC 1B 24 28 51 28 5E … E3 8A BF
❶ × 86 9F 1B 24 28 51 2C 21 … E2 9D B6

表せない文字を変換しようとしたときと、cp932 で書いたバイト列を別の文字コードで読んだときのエラー原文です。

>>> '①'.encode('shift_jis')
UnicodeEncodeError: 'shift_jis' codec can't encode character '①' in position 0: illegal multibyte sequence
>>> b'\x87\x40'.decode('shift_jis')
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 0: illegal multibyte sequence
>>> b'\x87\x40'.decode('cp932')
'①'

Windows で「Shift_JIS」と呼ばれているものの中身は、多くの場合 cp932(Windows-31J、MS932 とも呼ぶ)です。Python・Java・iconv では shift_jis と cp932 は別物として扱われ、丸数字はその差の部分に入っています。

メールで丸数字が化ける例(ISO-2022-JP)

この節では、メールの文字コードで丸数字が送れない・読めない場面を、実際に組み立てたメールで確かめた結果が分かります。

日本語のメールで以前から使われてきた ISO-2022-JP は、①を表せません。Python で ISO-2022-JP のメールを作ると、送る前の組み立ての時点でエラーになりました。UTF-8 にすると①のまま送れて、受け取った側でも①に戻りました。

from email.mime.text import MIMEText
from email.header import Header
m = MIMEText('手順①を確認', 'plain', 'iso-2022-jp')
UnicodeEncodeError: 'iso2022_jp' codec can't encode character '①' in position 2: illegal multibyte sequence

文字コードを utf-8 にしたときに作られたメールの中身です。

Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Subject: =?utf-8?b?5omL6aCG4pGg44Gr44Gk44GE44Gm?=

5omL6aCG4pGg44KS56K66KqN

受信側で読むと: 手順①について / 手順①を確認

送る側が独自の拡張で入れた①は、受け手で結果が分かれる

メールソフトによっては、ISO-2022-JP と名乗りながら NEC の拡張部分(①は 2D 21)を入れて送るものがあります。同じバイト列を読み比べると、Python の iso2022_jp 系はすべてエラー、Chromium の TextDecoder(WHATWG の仕様どおり)は①と読みました。同じメールでも、受け手のソフト次第で「読める」「化ける」が分かれるということです。

バイト列: ESC $ B  3C 6A 3D 67 2D 21  ESC ( B   (「手順①」)
Python iso2022_jp      : UnicodeDecodeError ... can't decode bytes in position 7-8
Python iso2022_jp_2004 : UnicodeDecodeError ... can't decode bytes in position 7-8
Chromium TextDecoder('iso-2022-jp') : 手順①

WHATWG Encoding Standard は、ブラウザーの日本語の表(index jis0208)に「IBM と NEC の拡張を含める」と定めています。ブラウザーで読めたからといって、ほかのメールソフトでも読めるとは限りません。

送り方 ① ㉑ 手元の結果
UTF-8 届く 届く Python の email で往復して一致
ISO-2022-JP(厳密) 送れない 送れない 組み立ての時点で UnicodeEncodeError
ISO-2022-JP+NEC 拡張 受け手次第 送れない Python はエラー、Chromium は①
ISO-2022-JP-2004 受け手次第 受け手次第 iso2022_jp で読むと UnicodeDecodeError

CSVで丸数字が化ける・消える例(Python・iconv・Java)

この節では、CSV やテキストファイルに丸数字を入れたときに、エラーになる・? に変わる・黙って消える、の3つの壊れ方が分かります。

壊れ方は言語とツールで違いました。Python と iconv はエラーで止まり、Java の getBytes は黙って ? に置き換え、iconv の -c は黙って消しました。 黙って変わるほうが気付きにくく、後で困ります。

Python:書き込みの途中で止まり、半端なファイルが残る

import csv
rows = [['No', '手順'], ['1', '①電源を入れる'], ['2', '㉑最終確認']]
with open('list.csv', 'w', encoding='cp932', newline='') as f:
    csv.writer(f).writerows(rows)
UnicodeEncodeError: 'cp932' codec can't encode character '㉑' in position 2: illegal multibyte sequence
$ wc -c list.csv
27 list.csv          ← 1・2行目だけ書かれた状態で残った

cp932 は①を表せますが㉑は表せないので、3行目で止まりました。エラーが出たあとにファイルが途中まで残る点に注意が要ります。読むときも、cp932 で書いたファイルを shift_jis や utf-8 で開くとエラーになりました。

read shift_jis : UnicodeDecodeError: 'shift_jis' codec can't decode byte 0x87 in position 11: illegal multibyte sequence
read utf-8     : UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 3: invalid start byte
read cp932     : [['No', '手順'], ['1', '①電源を入れる']]

iconv:SHIFT_JIS ではなく CP932 を指定する

$ iconv -f SHIFT_JIS -t UTF-8 list.csv
No,手順
1,iconv: illegal input sequence at position 11
$ iconv -f CP932 -t UTF-8 list.csv
No,手順
1,①電源を入れる

UTF-8 から変換する向きでは、指定によって①の行き先が変わりました。

iconv の変換先 「手順①」の結果
SHIFT_JIS illegal input sequence at position 6 で止まる
CP932 87 40 に変換される
EUC-JP 止まる。EUC-JP-MS なら AD A1 に変換
SHIFT_JIS//TRANSLIT ①が「(1)」の3文字に置き換わる
SHIFT_JIS に -c を付ける ①だけ黙って消え「手順」になる
ISO-2022-JP 止まる。ISO-2022-JP-3 なら変換される

Java:getBytes は黙って ? にする

String s = "手順①㉑";
byte[] b = s.getBytes("Shift_JIS");   // 例外は出ない
System.out.println(new String(b, "Shift_JIS"));
Shift_JIS    8e e8 8f 87 3f 3f        戻すと: 手順??
MS932        8e e8 8f 87 87 40 3f     戻すと: 手順①?
EUC-JP       bc ea bd e7 3f 3f        戻すと: 手順??
ISO-2022-JP  1b 24 42 3c 6a 3d 67 21 29 21 29 1b 28 42   戻すと: 手順??
UTF-8        e6 89 8b e9 a0 86 e2 91 a0 e3 89 91        戻すと: 手順①㉑
CharsetEncoder(Shift_JIS): java.nio.charset.UnmappableCharacterException: Input length = 1

String.getBytes は表せない文字を 3F(?)に置き換えて続けます。 ISO-2022-JP では全角の「?」になりました。表せないときに止めたいなら、CharsetEncoder を使うと UnmappableCharacterException で止まりました。

CSV をエクセルで開くときの文字化けの直し方は、関連記事「CSV文字化けの直し方|エクセルで今すぐ直す手順とUTF-8で直らない原因」で扱っています。Python で cp932 のエラーが出たときの直し方は、関連記事「UnicodeEncodeError: ‘cp932’の直し方|Python」と関連記事「UnicodeDecodeErrorの原因と直し方|cp932・utf-8・BOM」で扱っています。

ファイル名・zipの丸数字が化ける例

この節では、丸数字の入ったファイル名を zip でやり取りしたときに化ける仕組みと、Linux での読み直し方が分かります。

zip の作り方によっては、ファイル名が cp932 のまま、UTF-8 の印(フラグ)なしで入ります。それを Linux や Python が別の文字コードで読むと、「手順①.txt」が別の文字列に化けました。 読む側で cp932 を指定すると元に戻りました。

手元では、Python の zipfile で「ファイル名を cp932 のバイト列で書き、UTF-8 のフラグを立てず、作成元を MS-DOS/Windows にした zip」を作って再現しました。

win_style.zip  flag_bits=0x0000  Python既定: 'ÄΦÅçç@.txt'
utf8_flag.zip  flag_bits=0x0800  Python既定: '手順①.txt'
metadata_encoding=cp932: '手順①.txt'

$ unzip -l win_style.zip
        5  1980-01-01 00:00   ОшПЗЗ@.txt
$ unzip -O cp932 -l win_style.zip
        5  1980-01-01 00:00   手順①.txt
$ unzip -O SHIFT_JIS -l win_style.zip
        5  1980-01-01 00:00   �菇�@.txt

Python の zipfile は、UTF-8 のフラグが無い名前を cp437 として読むため「ÄΦÅçç@」になり、Python 3.11 から使える metadata_encoding='cp932' を付けると直りました。unzip は -O cp932 で直り、-O SHIFT_JIS では①の部分を変換できず名前全体が化けたままでした。ここでも「Shift_JIS ではなく cp932」が効いています。

Linux のファイルシステム自体は、①や㉑を含む名前をそのまま作れました(中身は UTF-8 のバイト列 e2 91 a0 など)。化けるのは、名前を別の文字コードの環境へ運ぶときです。zip・unzip の使い方そのものは、関連記事「zip・unzipコマンドの使い方|圧縮・解凍・パスワード・文字化け」で扱っています。

Webページ・フォームでの丸数字(文字参照・送信・フォント)

この節では、HTML に丸数字を書いたときの表示、Shift_JIS のページのフォームで丸数字を送ったときの中身、フォントによる見た目の違いが分かります。

UTF-8 のページなら①〜㊿はそのまま送れます。Shift_JIS と書いたページのフォームでは、①は 87 40 で送られ、㉑・㊿・❶は「&#12881;」のような文字参照の文字列に変わって送られました。

ページの文字コード  入力   フォーム送信で URL に付いた値
Shift_JIS           ①     q=%87%40
Shift_JIS           ⑳     q=%87S
Shift_JIS           ㉑     q=%26%2312881%3B   (= &#12881;)
Shift_JIS           ㊿     q=%26%2312991%3B   (= &#12991;)
Shift_JIS           ❶     q=%26%2310102%3B   (= &#10102;)
UTF-8               ①㉑   q=%E2%91%A0%E3%89%91

WHATWG Encoding Standard では、フォーム送信で表せない文字は「&#」「10進の番号」「;」の形で出すと定められています。受け取る側が文字参照を戻さないと、データベースに「&#12881;」という文字列がそのまま入ります。また、ブラウザーの Shift_JIS は cp932 と同じく NEC の拡張を含むため、Shift_JIS と書いたページに入れた 87 40 も①と表示されました(document.characterSet は "Shift_JIS")。

フォントが混ざると大きさがそろわない

フォントを指定しない行では、①・⓪・➀は欧文のフォント(Inter)、⑳・㉑は中国語のフォントで描かれ、40px で測った幅が①は55.6、⑳は40.0とばらつきました。lang="ja" と日本語のフォント(Noto Sans CJK JP)を指定すると、すべて40.0にそろいました。

40pxで測った幅 ① ⑳・㉑・㊿ ⓪・➀ ❶
フォント指定なし 55.6 40.0 55.6 35.9
Noto Sans CJK JP 40.0 40.0 40.0 40.0

この環境の163ファミリーのうち、①の形を持つフォントは96、㉑を持つものは73でした。見る人の端末に㉑〜㊿を持つフォントが無いと、豆腐(□)のような表示になることがあります。

プログラムで丸数字を扱うときの注意(数値・正規表現・並べ替え)

この節では、丸数字を数値・検索・並べ替えで扱うときに起きることを、Python と JavaScript の実行結果で見られます。

丸数字は数値に変換できず、正規表現の \d にも当たらず、並べ替えると数字の後ろに回ります。NFKC で正規化すると①は「1」になるので、検索や重複の判定では正規化してから比べます。

操作 Python 3.13 JavaScript(Chromium 153)
数値にする int('①') → ValueError Number('①') → NaN
\d に当たるか False(1 は True) /\d/u で false
isdigit など isdigit True・isdecimal False・isnumeric True /\p{N}/u で true
NFKC 正規化 ① → 1、㉑ → 21、❶ はそのまま 同じ(❶・➀ はそのまま)
文字数 len は 1、UTF-8 で3バイト、cp932 で2バイト length は 1

注意したいのは、Python の '①'.isdigit() が True になる点です。isdigit で「数字だけか」を調べてから int に渡すと、①で ValueError になります。数字だけかを調べるなら isdecimal を使います(⑩は isdigit でも False でした)。

>>> sorted(['⑩', '②', '①', '10', '2', '1', '❶'])
['1', '10', '2', '①', '②', '⑩', '❶']
JavaScript の Intl.Collator('ja', {numeric: true}) での並べ替え
['1', '2', '10', '①', '⑩', '②']

ふつうの並べ替えは文字の番号順なので、①②⑩の順にはなりますが、数字の後ろに回ります。数値を考える並べ替え(numeric)でも、丸数字は「①・⑩・②」の順になりました。番号で並べたいなら、丸数字を表示用にだけ使い、並べ替えには数値の列を別に持つのが確実です。

  • 1入出力の文字コードを UTF-8 にそろえるcp932 が要る相手には、送る前に㉑以上と黒丸・二重丸を (21) などに置き換える
  • 2表せない文字で止まる設定にするJava は CharsetEncoder、Python は errors の既定(strict)、iconv は -c を付けない
  • 3検索・重複判定は NFKC で正規化してから①と1を同じとみなすかを仕様で決める。❶・➀ は NFKC でも1にならない
  • 4数値の判定は isdecimal か正規表現の \disdigit は①で True になり、int で落ちる

文字化け全般の原因(濁点の分離や絵文字の文字数など)は、関連記事「文字化けの原因8選|濁点分離・utf8mb4・絵文字の文字数」で扱っています。

丸数字が化ける・出ないときの症状と直し方(よくあるエラー)

この節では、丸数字で困ったときに、見えている症状から原因と直し方を引けます。

症状・エラー原文 原因 直し方
変換しても丸数字が出ない 「まる」だけ、または「にじゅういち」と読んでいる 「まるいち」か数字の「1」「21」で変換する
51以上の丸数字が見つからない 1文字の丸数字は㊿まで (51) などの番号に切り替える
'shift_jis' codec can't encode character '①' Shift_JIS に①は無い cp932 か UTF-8 で書く
'cp932' codec can't encode character '㉑' cp932 に㉑以上は無い UTF-8 で書くか、(21) に置き換える
'shift_jis' codec can't decode byte 0x87 cp932 で書かれた①を Shift_JIS で読んだ encoding='cp932' で読む
iconv: illegal input sequence at position 11 -f SHIFT_JIS で cp932 の①を読んだ -f CP932 にする
Java で丸数字が ? になる getBytes("Shift_JIS") が黙って置き換えた MS932(Windows-31J)か UTF-8。止めたいなら CharsetEncoder
メール送信で 'iso2022_jp' codec can't encode ISO-2022-JP に①は無い 本文・件名を UTF-8 にする
zip を開くとファイル名が化ける cp932 の名前を別の文字コードで読んだ unzip -O cp932、Python は metadata_encoding='cp932'
データに「&#12881;」が入っている Shift_JIS のページのフォームから㉑を送った ページを UTF-8 にする
丸数字だけ大きさや形が違う 文字ごとに別のフォントで描かれた lang="ja" と日本語のフォントを指定する

どこで化けたか分からないときは、次の順に経路をたどると、壊れた場所を絞り込めます。

  1. 1入力した画面で①に見えているか見えていなければ入力方法の問題(変換・フォント)
  2. 2保存したファイルのバイト列を見るod -An -tx1 で 87 40(cp932)か E2 91 A0(UTF-8)か、3F(?)か
  3. 3送信・変換の指定を見るShift_JIS・ISO-2022-JP・EUC-JP の指定があれば、そこで消えている
  4. 4受け手の読み方を見るcp932 で書いたものを Shift_JIS や UTF-8 で読んでいないか
  5. 5表示のフォントを見るバイト列が正しいのに□なら、その字を持つフォントが無い

丸数字を使ってよい場面の判断表

この節では、文書・メール・データ・ファイル名などの場面ごとに、丸数字を使ってよいかを判断できます。

相手と経路がすべて UTF-8 なら①〜㊿を使えます。途中に Shift_JIS・ISO-2022-JP、または読み手の分からない経路があるなら、(1)・1. の番号にしておくほうが崩れません。

場面 ①〜⑳ ㉑〜㊿ 理由
Word・PDF などの文書 使ってよい 使ってよい 文書の中は Unicode。フォントは埋め込みか日本語のフォントで
UTF-8 のWebページ 使ってよい 使ってよい lang="ja" と日本語のフォントの指定で見た目をそろえる
メール(UTF-8 で送る) 使ってよい 使ってよい 手元の往復で一致した
メール(ISO-2022-JP 固定) 避ける 避ける 送れない、または受け手で化ける
CSV(相手が cp932 指定) 使える 避ける cp932 は⑳まで。㉑で書き込みが止まる
システムの入力値・ID・コード 避ける 避ける 数値にならず、正規化や検索の扱いが分かれる
ファイル名 避ける 避ける zip や別の環境へ運ぶと化けることがある
読み上げを前提にした案内 避ける 避ける 公的なアクセシビリティの解説では、機種依存文字を使わない例に挙がる

文字数の数え方(丸数字は1文字、UTF-8 では3バイト)が気になる場合は、関連記事の文字化けの記事とあわせて、送り先の上限がバイト数か文字数かを確かめておきます。

よくある質問

Q. 丸数字はどうやって出しますか? A. 日本語入力で「まるいち」または数字の「1」を入力し、変換候補から①を選びます。手元の Mozc では「まるいち」で5番目、「1」で10番目に①が出ました。見つからないときは、Windows の IME パッドや絵文字パネル、Mac の文字ビューアから選びます。

Q. 21以上の丸数字(㉑)はどう出しますか? A. 半角の「21」を入力して変換します。Mozc では「21」で7番目に㉑が出て、「にじゅういち」では出ませんでした。㊿(50)まで同じように出せます。

Q. 51以上の丸数字はありますか? A. 1文字の丸数字は㊿までで、51以上は Unicode にありません。ワープロの囲い文字で見た目を作るか、(51) などの番号に切り替えます。

Q. 丸数字は機種依存文字ですか?使ってはいけませんか? A. 以前はメーカーごとに番号が違う機種依存文字でしたが、①〜㊿は JIS X 0213 と Unicode に入っています。今は、保存・送信に使う文字コードが丸数字を表せるかで決まります。UTF-8 なら使え、Shift_JIS・ISO-2022-JP では使えません。

Q. Shift_JIS と cp932 は何が違いますか? A. cp932(Windows-31J・MS932)は、Shift_JIS に NEC・IBM の拡張文字を足した Windows の文字コードです。①〜⑳・Ⅰ・㈱などは cp932 にだけあり、Python・Java・iconv では shift_jis と cp932 を区別するため、ここで化けたりエラーになったりします。

Q. メールで丸数字を使ってもよいですか? A. メールソフトが本文を UTF-8 で送るなら①〜㊿のまま届きます。ISO-2022-JP で送る設定だと①を表せず、送れないか受け手で化けます。相手の環境が分からない業務の連絡では、(1)・1. の番号にしておくと確実です。

Q. CSV に丸数字を入れたら ? になりました。なぜですか? A. 書き出すときの文字コードが Shift_JIS などで、表せない丸数字が ? に置き換えられたためです。Java の getBytes("Shift_JIS") は例外を出さずに ? にしました。cp932(MS932)なら①〜⑳は残り、㉑以上も残すなら UTF-8 にします。

Q. ①を「1」として検索に当てたいときは? A. Unicode の NFKC 正規化をすると①は「1」、㉑は「21」になります。検索用の列を正規化して持つと、①と1を同じものとして探せます。黒丸の❶や➀は NFKC でも変わらない点に注意します。

Q. HTML で丸数字を書くには? A. UTF-8 のページならそのまま書けます。数値文字参照なら &#9312; または &#x2460; で①になります。

Q. 丸数字だけ形や大きさが違って見えます。 A. 文字ごとに別のフォントで描かれています。手元の Chromium では、フォントを指定しないと①と⑳で幅が55.6と40.0にずれ、日本語のフォントを指定するとそろいました。Web なら lang="ja" と日本語のフォントを指定します。

まとめ

  • 出し方:「まるいち」か数字の「1」で変換。21〜50は数字の「21」〜「50」で変換する。51以上の1文字の丸数字は無い。
  • 機種依存文字の今:①〜㊿は JIS X 0213 と Unicode に入っている。使えるかどうかは、保存・送信の文字コードで決まる。
  • 文字コードの実測:①〜⑳は cp932 で20字すべて表せ、Shift_JIS・EUC-JP・ISO-2022-JP は0字。㉑〜㊿は UTF-8 などの Unicode が要る。
  • 壊れ方の違い:Python・iconv はエラーで止まり、Java の getBytes は黙って ?、iconv -c は黙って消す。止まる設定のほうが後で困らない。
  • 判断:経路がすべて UTF-8 なら使ってよい。メールの ISO-2022-JP、cp932 指定の CSV(㉑以上)、ID・ファイル名では (1)・1. を使う。

参考・出典

確認日はいずれも 2026年10月29日です。

  • Unicode「Enclosed Alphanumerics(U+2460〜24FF)」:https://www.unicode.org/charts/PDF/U2460.pdf
  • Unicode「Enclosed CJK Letters and Months(U+3200〜32FF)」:https://www.unicode.org/charts/PDF/U3200.pdf
  • Unicode「Dingbats(U+2700〜27BF)」:https://www.unicode.org/charts/PDF/U2700.pdf
  • WHATWG「Encoding Standard」(Shift_JIS・ISO-2022-JP・index jis0208・フォームの数値文字参照):https://encoding.spec.whatwg.org/
  • Python ドキュメント「codecs 標準エンコーディング」:https://docs.python.org/ja/3/library/codecs.html#standard-encodings
  • Python ドキュメント「unicodedata」:https://docs.python.org/ja/3/library/unicodedata.html
  • Python ドキュメント「zipfile」(metadata_encoding):https://docs.python.org/ja/3/library/zipfile.html
  • Microsoft サポート「Windows のキーボード ショートカット」:https://support.microsoft.com/ja-jp/accessibility/windows/keyboard-shortcuts-in-windows
  • Microsoft サポート「Advanced input methods for East Asian languages」(IME パッド):https://support.microsoft.com/en-us/help/4027029/windows-advanced-input-methods-for-east-asian-languages
  • Microsoft サポート「Insert ASCII or Unicode character codes in Word」:https://support.microsoft.com/en-us/Word/insert-ascii-or-unicode-character-codes-in-word
  • Apple サポート「Macで絵文字と記号を使用する」:https://support.apple.com/ja-jp/guide/mac-help/mchlp1560/mac
  • Apple サポート「iPhoneでよく使うテキストの代わりになる表現を設定する」:https://support.apple.com/ja-jp/guide/iphone/iph6d01d862/ios
  • Android「Gboard の便利な使い方を徹底解説! Android で役立つ単語登録などの Tips まとめ」:https://www.android.com/intl/ja_jp/articles/460/
  • 総務省 東海総合通信局「その3 半角カタカナや機種依存文字を使用しない」:https://www.soumu.go.jp/soutsu/tokai/siensaku/accessibility/L3_text1.html
  • Google「Mozc」(リポジトリ):https://github.com/google/mozc

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「丸数字(①)の出し方|21以上と機種依存文字で化ける原因を実測」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

成長のヒミツ、 ぜんぶ丸わかり