- 技術 💻
丸数字(①)の出し方|21以上と機種依存文字で化ける原因を実測
結論
丸数字(①)は、日本語入力で「まるいち」や数字の「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フォームで丸数字を使ってよいかの判断表
この記事で実際に動かしたもの: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」と入れ、スペース(変換)を押して候補から①を選ぶ。候補の順番は IME と学習の状態で変わる。
IME パッドか絵文字パネルを開く
Microsoft のサポートページでは、IME のメニューで「IME パッド」を選ぶと開けると案内されています。キーボードのショートカット一覧では、Windows キー+ピリオド(.)またはセミコロン(;)が「絵文字パネルを開きます」とされています。
Word では番号から入れる
Word では、Unicode の番号(16進数)を入力して Alt+X を押すと記号に変わります(Microsoft の Word 向け説明)。①は 2460、㉑は 3251、㊿は 32BF。
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以上を丸数字で書きたいとき
見分ける問い:「この一覧は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 に書くときは、数値文字参照 ①(10進)や ①(16進)でも同じ①になります。Chromium で ①⑳㉑㊿ を表示すると「①⑳㉑㊿」と出ました。
機種依存文字とは(丸数字が化けると言われる理由)
この節では、機種依存文字の意味と、丸数字がその代表として扱われてきた経緯が分かります。
機種依存文字とは、規格に定められていない、メーカーが独自に番号を割り当てた文字のことです。 総務省 東海総合通信局のウェブアクセシビリティの解説では「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 で送られ、㉑・㊿・❶は「㉑」のような文字参照の文字列に変わって送られました。
ページの文字コード 入力 フォーム送信で URL に付いた値
Shift_JIS ① q=%87%40
Shift_JIS ⑳ q=%87S
Shift_JIS ㉑ q=%26%2312881%3B (= ㉑)
Shift_JIS ㊿ q=%26%2312991%3B (= ㊿)
Shift_JIS ❶ q=%26%2310102%3B (= ❶)
UTF-8 ①㉑ q=%E2%91%A0%E3%89%91
WHATWG Encoding Standard では、フォーム送信で表せない文字は「&#」「10進の番号」「;」の形で出すと定められています。受け取る側が文字参照を戻さないと、データベースに「㉑」という文字列がそのまま入ります。また、ブラウザーの 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' |
| データに「㉑」が入っている | Shift_JIS のページのフォームから㉑を送った | ページを UTF-8 にする |
| 丸数字だけ大きさや形が違う | 文字ごとに別のフォントで描かれた | lang="ja" と日本語のフォントを指定する |
どこで化けたか分からないときは、次の順に経路をたどると、壊れた場所を絞り込めます。
- 1入力した画面で①に見えているか見えていなければ入力方法の問題(変換・フォント)
- 2保存したファイルのバイト列を見る
od -An -tx1で 87 40(cp932)か E2 91 A0(UTF-8)か、3F(?)か - 3送信・変換の指定を見るShift_JIS・ISO-2022-JP・EUC-JP の指定があれば、そこで消えている
- 4受け手の読み方を見るcp932 で書いたものを Shift_JIS や UTF-8 で読んでいないか
- 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 のページならそのまま書けます。数値文字参照なら ① または ① で①になります。
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期連続の黒字決算。