日本語文字コードと変換

12.4.4. 日本語文字コードと変換

新しく作成する文書はUnicodeと utf-8 を使うことが無難です。 過去の文書を読む場合などでは、それ以外の文字コードを読んだり変換して使うこともあるかもしれません。

日本語文字コード #

日本語に広く使われてきた代表的な文字コードは以下の3種類です。 対象とする文字集合が Unicode より狭いため、日本語だけを表すなら、utf-8 などより短く符号化できます。

ISO-2022-JP (JISコード)
ASCII文字をそのまま表現し、他の文字も7bitの範囲で表現します。インターネットの電子メールで使われてきました。日本語on, 日本語off のような文字集合の切り替えを文字を使います。
EUC-JP (日本語 EUC)
ASCII文字をそのまま表現し、切り替え文字を使いませaん。 Linux など UNIX 系統の OS で広く使われてきました。 バックスラッシュ\が使えますが、円記号¥は使えません。
Shift_JIS (シフト JIS)
過去の Windows や Macintosh でこの亜種が使われてきました。特にWindowsのものは CP932 です。円記号¥が使えますが、バックスラッシュ\は使えません。

次の表は、3 つの符号化方式と文字集合の対応です。表の要素は16進数で数の範囲を示し、#1, #2 などは 1文字を複数バイトで表す際の第1バイト第2バイトなどを表します。

ISO-2022-JP(JIS コード)の詳細

ISO-2022-JP #

インターネットの電子メールで使われてきました。区切り文字を使って、 ASCII や JIS X 0208 の文字集合を切り替えながら両文字集合の文字を表現します。具体的には、

ESC ( B → ASCII
ESC ( J → JIS X 0201 下半分(JIS ローマ字)
ESC $ @ → 78JIS
ESC $ B → 83JIS or 90JIS

といった文字列(エスケープシーケンスといいます。ESC はASCIIの制御文字の1つです)で、「ここからはこの文字集合を使うよ」ということをその都度指定するわけです。JIS X 0208 の文字は、区・点をそれぞれ 21(16) から 7E(16) の範囲の数値にスライドし, 計 2 バイトで 1 文字を表現します。

この符号化方式は、最上位ビット(8ビット目)を使いません。そのため過去に 7bitしか使えない通信路でも使用することができました。 一方で「今使っている文字集合は何か」を常に覚えておく必要があります。同じバイト列がモードにより別の文字になるためです。

EUC-JP (日本語EUC) の詳細

EUC-JP #

Linux 等の UNIX 系統の OS で使われてきました。ASCII とJIS X 0208 を共存させるために、JIS X 0208 の文字は、区・点を

\(\texttt{A1}_{(16)}\)  から \(\texttt{FE}_{(16)}\)  の位置にスライドさせて表します。

この符号化では、区切り文字を必要とせず最上位ビットを見るだけで、その文字が ASCII か否かがわかります。 つまり1バイト目が128未満ならASCII、128以上ならなら続く文字と組み合わせて日本語文字とわかります。 一方、ISO-2022-JPと比べて、JIS 仮名には 2 バイトが、JIS 補助漢字には 3 バイトと、一部の文字が長くなっています。

Shift_JIS (シフトJIS, SJIS) の詳細

Shift_JIS #

Windows や Macintosh で伝統的に使われている漢字コードです(実際に両 OS で使われているのは亜種です)。符号化方式としては、JIS ローマ字 (0201) をそのままに、他の日本語をずらして表現します。具体的には、JIS X 0201 はそのまままま採用し、のこりの81 から 9F までと、E0 から EF までを第 1 バイトとした部分に JIS 基本漢字 (0208) の文字集合を押し込めています。いわゆる半角カナが 1 バイトで表現でき、漢字も 2 バイトとコンパクトな表現です。トレードオフとして、拡張性が低く、また漢字を表すときの 2 バイト目に 128 未満の値が現れてしまい ASCII文字と誤認しやすい という問題もあります。

なおWindows で伝統的に使われている漢字コードは、正確に言うとシフト JIS ではなく、CP932 と通称されるものです。詳しい事項は省きますが、プログラミングを行うときなどにシフト JIS と CP932 の些細な違いが問題になることがあります。

対応文字 #

どの符号化もASCIIの文字と日本語のJIS 基本漢字にはおおむね対応しますが、 Unicode では使える文字も、状況によっては対象外で使えないこともあります。

いわゆる半角カナは ISO-2022-JP では使えません (普通のいわゆる全角のカタカナを使いましょう)。

半角文字と全角文字

過去にフォントサイズを自由に変えられなかった頃 (ワープロ専用機と近い時代です)、 英数字などを縦横比が 2:1 の細い字形で表示し、漢字などの日本語の文字は縦横比が 1:1 の字形で表示することが主流でした。 前者を半角文字、後者を全角文字と慣習的に呼ぶ場合があります。 その後も JIS X 0201 の文字には2:1に近い字形が使われたことから、それらを半角文字と呼ぶことがあります。特に、表の下半分のカタカナと関連する記号は半角カナと呼ばれます。

現在では文字の幅はフォント次第です。プロポーショナルフォントでは、同じASCII文字でも G は太く i は細く表示されます。

また過去には文字の符号化に必要な情報量から、半角文字・全角文字のことをそれぞれ「1 バイト文字」「2 バイト文字」と呼ぶ場合もありました。これも正確ではありません

  • 半角カナは、Shift_JIS では 1 バイトで符号化されますが、EUC-JP では 2 バイト、UTF-8 では3 バイトを必要とします。
  • EUC-JP, ISO-2022-JP, Shift_JIS では全角文字は 2 バイトで符号化されますが、UTF-8 では全角文字は 3 バイトまたは 4 バイトを必要とします。

JIS 規格などにより標準化がされる前に、企業が独自に追加の文字を追加することがありました。これらの文字はその由来から互換性が低く、慣習的に機種依存文字といいます。

  • 丸囲い数字(①、②、……)や、一文字に収めた省略記号(㈱など)
  • 全角のローマ数字(Ⅰ、Ⅱ、ⅸ、……)
  • 全角1文字の中に「mm」「kg」「キロ」などと収めた単位記号(㎜、㎏、㌔、……)
  • 罫線記号
  • 一部の漢字や携帯電話の絵文字
これらの文字は現在の Unicode には含まれているので、ほとんどの環境でこのページも正しく読めていると思われます。 ただし、それでもファイル名など「コンピュータも読む」状況では使わない方が無難です。たとえば、Windows でファイル名に丸数字を入れて zip でアーカイブして受け渡し、他の人が mac で展開すると文字化けする、などのことが今でも起こります。 丸数字 と曜日 は典型的なパターンです。

文字コードの変換 #

特殊な文字がなければ utf-8 と iso-2022-jp, euc-jp, Shift_JIS などの文字コードを相互に変換することができます。

GUI で行う方法は 次節の 12.6. テキストファイルとmi で紹介します。 コマンド 13.5. テキストの表示と文字コード で行うこともできます。

参考文献 #

文字コードは、技術的制約と歴史的経緯が入り組んでいて、少し触れただけではすっきりとした理解が難しいところがあります。 興味があれば、他の書籍も参考にしてください。

矢野啓介 [改訂新版]プログラマのための文字コード技術入門(技術評論社)
多言語環境とUnicode 日本語文字コードと変換 Colabを使った演習
このサイトは開発版の はいぱーワークブック です.