回 1-2 道 1 数と論理と計算量
文字コードは、
読み終えたら文字が
この頁の流れ
文字の
なぜ 「あ」は 1 文字なのに 3 バイトなのか
コンピュータが
1 つ目は
2 つ目は
文字コードは どう 動いているのか
文字コードは
文字に 番号を 振る Unicode
Unicode (世界中のU+ の
Python では、ord、番号からchr です。str) は、
英数字の 土台の ASCII と制御文字
ASCII (英数字と
動かす 制御文字の番号
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
'A' 65
' ' 32
'\t' 9
'\r' 13
'\n' 10
b'1,2\r\n'タブは
番号を バイトに 直す UTF-8
UTF-8 は、
| 符号位置の範囲 | バイト数 | 先頭の |
|---|---|---|
| U+0000〜U+007F | 1 | 0xxxxxxx |
| U+0080〜U+07FF | 2 | 110xxxxx |
| U+0800〜U+FFFF | 3 | 1110xxxx |
| U+10000〜U+10FFFF | 4 | 11110xxx |
ただし 3 バイトの
2 バイト目から10xxxxxx の
日本語で 使う 文字コードの種類
日本語の
動かす 同じ「あ」を 5 つの決まりで
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
shift_jis 2
82 a0
euc_jp 2
a4 a2
iso2022_jp 8
1b 24 42 24 22 1b 28 42
utf-8 3
e3 81 82
utf-16-le 2
42 30| 文字コード | 「あ」 | WHATWG の扱い |
|---|---|---|
| Shift_JIS | 2 バイト | 古い |
| EUC-JP | 2 バイト | 古い |
| ISO-2022-JP | 8 バイト | 古い |
| UTF-8 | 3 バイト | 新しい |
| UTF-16 | 2 バイト | 読めるが |
ISO-2022-JP の1b 24 42 は1b 28 42 は24 22 です。42 30 は、
動かして確かめる
文字の
文字ごとの 符号位置とバイト数
英字、chr(0x1F600) で
動かす 符号位置と UTF-8 のバイト
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
A 65 U+0041 1 41
é 233 U+00E9 2 c3 a9
あ 12354 U+3042 3 e3 81 82
漢 28450 U+6F22 3 e6 bc a2
顔 128512 U+1F600 4 f0 9f 98 80左から、41 はc3 はe3 はf0 は
文字数と バイト数は別の数
len は
動かす len とバイト数
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
4
11
24 文字の"e" + chr(0x301) はlen は
どこで 崩れるのか
文字コードは
別の 決まりで 読むと 文字化けする
UTF-8 でerrors="replace" は、
動かす 文字化け
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
e6 97 a5 e6 9c ac
譌・譛ャ
93 fa 96 7b
���{
82 a0UTF-8 の7b だけが{ として82 a0 で、e3 81 82 とは
Python の decode は、errors を'strict' で、replace は
その 決まりに 無い 文字は書けない
Shift_JIS の
動かす 表に無い文字
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
illegal multibyte sequence
4UTF-8 は、
Excel で 開くと 化ける CSV と BOM
UTF-8 でEF BB BF の
Python では、utf-8-sig で
動かす BOM を付けて書く
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
e5 90 8d e5 89 8d
ef bb bf e5 90 8d
3
'\ufeff名前'
TrueBOM をutf-8 で\ufeff がutf-8-sig で
仕事では どう 確かめるのか
文字コードは
- ファイルを
開く ときに 決まりを 書く。 Python なら open(path, encoding="utf-8")のように、既定に任せない - 欄の
上限が 「文字」か 「バイト」かを 仕様で 確かめ、 日本語と 絵文字を 入れた 試験を足す - 化けた
字を 見たら、 まずバイトを 16 進で出す。 b.hex(" ")の先頭がe3やe6ならUTF-8 の 3 バイトの字、 82や93ならShift_JIS の 可能性を疑う
文字コードを見分ける
バイト列だけから
動かす 決まりを当てる
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
utf-8 utf-8
cp932 cp932
utf-8-sig utf-8-sig3 つとも
UTF-8 に直す
UTF-8 にshift_jis ではcp932 で
動かす cp932 から UTF-8 へ
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
93 fa 96 7b 2c 87 40
e6 97 a5 e6 9c ac 2c e2 91 a0
illegal multibyte sequence① は87 40 のe2 91 a0 のshift_jis で
手元のファイルを UTF-8 に直す
src = "in.csv"
dst = "out.csv"
with open(src, "r",
encoding="cp932") as f:
text = f.read()
with open(dst, "w",
encoding="utf-8") as f:
f.write(text)符号位置の 名前を引く
見た
動かす 符号位置の名前を引く
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
U+002D HYPHEN-MINUS
U+2212 MINUS SIGN
U+FF0D FULLWIDTH HYPHEN-MINUS
U+2010 HYPHENキーボードで
この 回の 知識が 効いた記録
UTF-8 の
RFC 3629 (2003年11月) の2F 2E 2E 2F (/../、上の2F C0 AE 2E 2F をC0 AE は
動かす 決まりに反する並び
▶ 実行ボタンを押すと結果がここに表示されます
実行すると、次の通りに出ます
/��./
invalid start byteRFC は、C0 を
よくある問い
UTF-8 とは何ですか
Unicode の
文字コードと エンコードの 違いは何ですか
文字コードは
文字化けした データは 元に 戻せますか
バイト列がerrors="replace" で
ファイルを UTF-8 に 変換するには どうしますか
元のencoding="cp932" で読み、encoding="utf-8" でutf-8-sig で
ファイルの 文字コードは どうやって 見分けますか
バイト列だけから
確認クイズ
答えだと
1 問目
ひらが
2 問目
UTF-8 で
3 問目
次の
BOM を付けたバイト数
b = "日本".encode("utf-8-sig")
print(len(b))4 問目
Python でopen に
説明課題
次の
- 「漢」が
UTF-8 で 何バイトに なるかを、 決まりから 数える手順 - Windows で
作った Shift_JIS の CSV を、 UTF-8 に 直す手順と、 その ときに 気を つけること
自分の
この回の 先の一歩
文字化けの
もっと深く
この
一次資料
どれも
- RFC 3629 UTF-8, a transformation format of ISO 10646 (IETF、英語)。範囲ごとの
バイト数と 先頭の バイトの 形、 サロゲートを 書かない こと、 決まりに 反する 並びの 例と 2001年の ウイルス、 é の 2 通りの表し方 - FAQ UTF-8, UTF-16, UTF-32 and BOM (Unicode Consortium、英語)。範囲が
U+10FFFF までで Unicode 2.0 (1996年7月) から、 UTF-8 が Web で 最も 多い こと、 UTF-8 の BOM は EF BB BFの署名で、 受け取ると 思っていない 読み手もいること - Encoding Standard (WHATWG、英語)。新しい
形式に UTF-8 を 求める こと、 古い 日本語の 文字コード 3 つ、 Shift_JIS の 表が IBM と NEC の 字を 含むこと、 ISO-2022-JP の 切り 替えの 印、 UTF-16 に 書き手が無いこと - RFC 20 ASCII format for Network Interchange (IETF、英語)。表の
0 列と 1 列が 制御文字で、 HT、 LF、 CR を含むこと - Opening CSV UTF-8 files correctly in Excel (Microsoft サポート、英語)。BOM 付きの
UTF-8 の CSV は 普通に 開け、 無ければ 「データの 取得」から開くこと - codecs (Python 公式文書、英語)。
cp932などの日本語の決まり、 utf-8-sigがBOM を 足して 読むときに 外すこと、 外の 情報が 無ければ 文字コードは 確実に 決められないこと、 'replace'がU+FFFD にすること - Built-in Types と
Built-in Functions (Python 公式文書、英語)。 errorsの既定が'strict'であること、 文字列が 符号位置の 並びであること、 ordとchr
次へ
道 1 数と論理と計算量の回
- 1-12 進数と
16 進数桁の 重み、 変換、 表せる範囲頁で読む - 1-2文字コードと文字化けUnicode、
UTF-8、 Shift_JIS、BOMこの回 - 1-3計算量を数えるBig-O、
ループの回数頁で読む - 1-4論理と真理値表AND、
OR、 NOT、 ド・モルガン準備中 - 1-5リトルエンディアンと
ビッグエンディアンバイトの 並び順、 ネットワーク、ファイル頁で読む - 1-6Base64 の仕組み64 字の
表、 = の 詰め物、 長さ 4/3頁で読む - 1-7情報量と
ハフマン符号化ビット、 確からしさ、圧縮頁で読む - 1-8チューリングマシンと停止問題テープ、
状態、 計算できない問題頁で読む
