miauのブログ

はてなダイアリー「miauの避難所」をはてなブログに移行しました

文字集合の包含関係とテストに使うべき文字

先月あたりから文字コードまわりの調査をしていたので、そのことについて書こうと思ったのですが。もろもろの説明の前提としてエンコーディングに対する説明が必要で、エンコーディングの説明にはその対象となる文字集合についての説明が必要で・・・ということで、まずは文字集合についての概説です。

目的

冒頭に書いたように、私が行った文字コードまわりの調査結果を書くための前提部分の説明が目的ではあるんですが、もうひとつ目的がありまして。

Web を見てまわっていると、いくつかの文字を不適切に選んで「この文字で確認したらうまくいったから大丈夫」というように不十分な調査がなされている事例が多々ありました。せっかく調査結果をまとめてくれているのに不十分なせいで活用できない=同じ調査を再度行う、という残念なことになってしまっているので「今後調査/テストを行う際にどのような文字を抽出すればよいか」という基礎情報的なものを示すことができればいいなと。

説明の方針

いちおうテーマは文字集合なのですが、プログラマが実際に扱うことになるのは符号化されたデータのほうなので、そちらについても必要に応じて言及しています。主に「可能な限り文字化けしない」(=入力した文字がそのまま保たれる)ことを目的としていますので、字体の変化や文字の入れ替え等には言及していません。

なお、気になっているのは Shift_JISEUC-JP のような JIS ベースの符号化ですので、ISO-8859-1 のように JIS と関係のない文字集合には言及しません。

包含図

各包含関係の中に、そこの含まれる代表的な文字と、可能であればその領域に含まれる文字数(多数ある場合は * 等で省略)を記載しています。

理解不足や間違い等もあると思いますので、気づいた点があればご指摘ください。

文字集合の概説

これだけ見ても「何がなにやら」という感じだと思うので、簡単に説明しておきます。

右下で背景色がカラフルになっている部分がありますが、これは細かい話になってくるので、まずは枠で囲んだ部分だけ説明します。

ASCII

キーボードに記載されている英数字&記号たちです。(日本語キーボードの ¥ を除く)

JIS X 0201

ラテン文字(基本的に ASCII と同じ英数字)+カタカナ(いわゆる半角カナ)です。

英数字の部分は ISO 646(ASCII のうち 12 文字を各国の事情に合わせて差し替えられるようにした規格)に従っており、「\」(バックスラッシュ)と「~」(チルダ)は JIS X 0201 では「¥」と「‾」に置き換えられています。現在主流のエンコーディングでは ASCII と互換性を持った形でマッピングが行われるので、あまり気にしなくて良い部分ではあるのですが、これが円記号問題の発端になっています。

JIS X 0208-1978

ひらがなや標準的な漢字、全角の英数字、記号、カタカナが含まれています。ここで規定されている英数字、記号、カタカナについては、厳密には全角に割り当てることにはなっていないのですが、実際は全角の記号に割り当てられているのでこのように考えていていいと思います。

機種依存文字

広義では絵文字なんかも機種依存文字になるようですが、ここでは Windows機種依存文字である NEC 特殊文字IBM 拡張文字、NEC選定IBM拡張文字の総称として説明します。図はかなり見づらくなってしまったので、ここだけ簡単にして抜き出します。


  • NEC 特殊文字IBM 拡張文字
    • JIS X 0208-1978 に含まれない文字を、NECIBM がそれぞれ独自に定義したものです。共通している文字もあれば、そうでないものもあります。
  • NEC選定IBM拡張文字
    • IBM 拡張文字のうち、NEC 特殊文字に含まれていなかった部分を NEC が追加したものです。

このような包含関係になっているため、以下のいずれかの組み合わせで機種依存文字はカバーできることになります。

なお、CP932(日本語の Windows 環境で標準として使われる Shift_JIS の拡張。IANA では Windows-31J の名称。)では NEC 特殊文字IBM 拡張文字、NEC選定IBM拡張文字 を全て取り込んでいます。NEC 特殊文字NEC選定IBM拡張文字だけですべての文字集合が表せるわけですから、IBM 拡張文字に元々含まれている文字については二箇所に出現することになります。

JIS X 0208-1983

JIS X 0208-1978 に 75 文字追加されています。うち 10 文字については機種依存文字として存在していた部分であり、CP932 では機種依存文字に加えこれらの文字も保持していますので、これらも二重登録(もともとIBM 拡張文字と NEC 系で重複していた「∵」「¬」に至っては三重登録)されます。

JIS X 0208-1990 / JIS X 0208:1997

JIS X 0208-1990 では JIS X 0208-1983 からさらに 2 文字追加されています。JIS X 0208:1997 では文字の追加は行われていないので、JIS X 0208 といったらこの範囲だと考えればよいです。JIS X 0208-1983 の流れがあったので図示しましたが、調査の際は特に意識する必要はない部分です。

JIS X 0212補助漢字

JIS X 0208 に足りない文字を新しく定義したものです。いろいろ情報を見ていると「JIS X 0213 に置き換えられる予定」みたいな書き方になっていて軽視されていそうですが、本来の EUC-JP では利用可能な領域なので少し注意が必要です。とはいっても Windows 上で EUC-JP という場合は CP932 と同じ文字集合からなる CP51932 を指す場合が多く、JIS X 0212 の範囲が扱えないことが多いのですが。(これについては次回詳しく書きます。)

JIS X 0213:2000(拡張漢字/第三水準、第四水準)

JIS X 0208 で不足している文字を補うという目的は JIS X 0212 と同じなのですが、JIS X 0208 を包含する形で、Shift_JIS の余った領域に詰め込めるように文字を選びなおしたものです。JIS X 0212 は使わず JIS X 0213 を使っていく方向だったみたいですが、CP932 と非互換な部分があるためか、エンコーディングとしてはあまり使われていないようです。

もともと Unicode 外の領域を使用していましたが、Unicode 3.1、3.2 で全ての領域がカバーされており、現時点では JIS X 0213 の文字を扱う際は Unicode で扱うことになります。

Unicode では BMP 外の文字(UTF-16サロゲート・ペアとなる、いわゆる 4 バイト文字)が含まれるので注意が必要です。また、一部の文字については Unicode で 1 文字にマッピングされず、Unicode 2 文字を合成して表すことになっています。

JIS X 0213:2004

いわゆる JIS2004 で、JIS X 0213:2000 から 10 文字が追加されました。包含図では JIS X 0213:2000 を囲む形で図示すべきなんですが、さすがにごちゃごちゃしすぎるので追加部分だけを図示しています。

Windows Vista がこの領域の文字を扱えるようになったことが話題になっていましたが、現時点ではエンコーディングとして利用できないため、Web アプリケーションを作る立場では「Vista からはこの領域の文字も送られてくる」という程度の認識でよいと思います。注意点は Unicode の扱いと同じです。

Unicode 3.0、3.1、3.2

JIS X 0213 の範囲が Unicode の範囲に収まっていることを示すために図示したかっただけで、調査の際はバージョンはあまり気にしなくていいはずです。(今後 6.0 の絵文字等は気にする必要があるかもしれませんが。)

NEC 選定 IBM 拡張文字の文字種について

さきほど説明を省略した右下のカラフルな部分についてですが、参考にしたページを先に挙げておきます。ほぼこのページの受け売りです。

NEC 選定 IBM 拡張文字の領域には記号と漢字が含まれていますが、漢字については Unicode 上で

  • CJK 統合漢字(CJK UNIFIED IDEOGRAPH)
  • CJK 互換漢字(CJK COMPATIBILITY IDEOGRAPH)

の 2 つに分類されています。CJK 統合漢字は通常どおりに使ってよいのですが、CJK 互換漢字はその名のとおり互換性のために残されている文字で、Unicode 本来の立場からすると CJK 統合漢字にある別の文字に置き換えてしまいたいけれど、それをやってしまうとラウンドトリップ変換が行えないので仕方なく残している、という文字です。

CJK 互換漢字は Unicode 上でいくつかの領域に分かれて定義されています。基本的に NEC 選定 IBM 拡張文字の領域については「The IBM 32 compatibility ideographs(IBM拡張文字に基づくもの)」に含まれているんですが、「朗」「隆」の 2 文字については「Pronunciation variants from KS X 1001:1998(KS X 1001:1998(韓国)における発音重複に基づくもの)」に含まれています。

このあたりはわざわざ分類しなくてもいいんですが、The IBM 32 compatibility ideographs はカナダ文字とも言われる領域で、私が調査中に「32 文字って書いてあるけど、数えると 34 文字あるぞ?どこかで分類間違えたかな?」と焦ってしまったので、念のため図示しました。

「The IBM 32 compatibility ideographs(IBM拡張文字に基づくもの)」については、参考ページの注意書きに

「備考」の項目に「統合漢字」とあるものは、互換用ではなくCJK統合漢字です(詳細)。

と書かれており、この部分については CJK 統合漢字と同じように使用してもよいそうです。結果としてこの領域右側の黄色とピンクの領域が CJK 互換漢字ということになり、この領域のものはアプリケーションによって CJK 統合漢字に置き換えられることがあるので注意が必要です。たとえば Skype がこういった動作になっていて、テスト用に機種依存文字を送ったつもりがちゃんと送れてなくてハマったりしました。Chrome も条件によっては一部の文字で不思議な動作をしたりしていたんですが、これについてはまた後日。

図の左側に、JIS X 0213 に含まれる CJK 互換漢字も表記してあります。こちらは「JIS X 0213 compatibility ideographs(JIS X 0213における包摂基準変更に基づくもの)」に含まれており、すべて互換漢字として扱ってよいようですので、こちらについても CJK 統合漢字に置き換えらえられると困るのであれば、注意が必要になります。

CP932 のマッピングが特殊な文字について

文字集合の話からは逸れてしまうんですが、せっかくテスト用に使える文字種を羅列しているので、CP932 で注意が必要な文字についても簡単に記載しておきます。

Windows の変換が特殊といわれているのは以下の 8 文字だと思います。

CP932 CP932 での名称 Win other
0x815C HORIZONTAL BAR U+2015 U+2014
0x8160 FULLWIDTH TILDE U+FF5E U+301C
0x8161 PARALLEL TO U+2225 U+2016
0x817C FULLWIDTH HYPHEN-MINUS U+FF0D U+2212
0x8191 FULLWIDTH CENT SIGN U+FFE0 U+00A2 ¢
0x8192 FULLWIDTH POUND SIGN U+FFE1 U+00A3 £
0x81CA FULLWIDTH NOT SIGN U+FFE2 U+00AC ¬
0xFA55 FULLWIDTH BROKEN BAR U+FFE4 U+00A6 ¦

Win が Windowsマッピング方式で、other はそれ以外での方式で発生しえるマッピング先です。WindowsAPI を利用するとすべて Win の文字になりますが、それ以外のものについてはライブラリや製品、指定する文字コードによってこの組み合わせはまちまちなので、注意が必要です。

特に「〜」のマッピングに失敗して「?」等になる問題が発生するケースが多いです。これと「−」(全角ハイフン)以外の文字はあまり使わないので問題視されにくいですが、もし入力されたら同じように「?」になったりするわけなので、適切に処理されることは確認しておくべきでしょう。

MS 公式にもちゃんとまとまっていないんですが、参考となる情報としては以下のものがありました。

上記以外に、JIS の原理主義に近い形でマッピングを行うと、以下のようになっているケースもあるかもしれません。ただ、現在ではほとんど見かけることはないと思います。

CP932 CP932 での名称 Win other
0x5C REVERSE SOLIDUS (YEN SIGN) U+005C \ U+00A5 ¥
0x7E TILDE U+007E ~ U+203E
0x815F FULLWIDTH REVERSE SOLIDUS U+FF3C U+005C \
0x8150 FULLWIDTH MACRON U+FFE3 U+203E
0x818F FULLWIDTH YEN SIGN U+FFE5 U+00A5 ¥

結局どの文字をテストに使えばいいの?

目的によって違うので「これで十分」というものはないのですが、不適切な選び方をしないように気をつければいいんじゃないかと思います。

  • NEC 特殊文字をテストするのであれば「①」のように JIS X 0208 に含まれないものを選ぶ(※JIS X 0213 はあまり使われてないのでとりあえずここでは無視)
  • EUC-JP が関わる環境で NEC 選定 IBM 拡張文字をテストするのであれば、「髙」のように JIS X 0212 に含まれないものを選ぶ
  • Unicode の文字をテストするのであれば、問題の切り分けが容易なように「☺」のように JIS 外の文字を選ぶ
    • もし切り分けの容易さよりも手順の簡単さを選ぶなら、いきなりサロゲートペアの「𠮷」を選ぶというような選択もあり

といった感じです。

文字の一覧(コピペ用)

本当は図を SVG 等で出力してコピーできるようにしたかったのですが、機種依存文字が含まれまくっているせいか Cacoo でうまくエクスポートできなかったので、コピペ用に文字の一覧を記載しておきます。

「この文字が化けるけどどの領域に含まれているんだっけ?」という場合にも使えるよう、機種依存文字と CJK 互換漢字についてはすべての文字を記載しました。図中で代表として使った文字については太字で示しています。

追記: 最初は図と見比べながら使う前提でただ羅列していたんですが、見比べにくい気がしたので説明を追加しました。このリスト単独でもそれなりに使えるとは思いますが、たとえば JIS X 0212 の項にすべての JIS X 0212 の箇所が載っているわけではない(機種依存文字に含まれる部分はそちらに載せている)というような部分もあるので、図と見比べて過不足がないか確認した上でご利用ください。

  • JIS X 0201
    • ¥‾(※多すぎるので入力しづらい 2 文字のみ)
  • JIS X 0208
    • あ亜Aア¥凜熙♪堯(※多すぎるので図に記載したもののみ)
  • NEC 特殊文字にのみ存在
    • JIS X 0208 に含まれるもの
    • JIS X 0213 に含まれるもの
      • ②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡㍻〝〟㏍㊤㊥㊦㊧㊨㈲㈹㍾㍽∮∟
    • JIS X 0213 に含まれないもの
  • NEC 特殊文字IBM拡張文字の重複部分
  • NEC 選定IBM拡張文字
    • 記号(全て JIS X 0213 に含まれる)
      • JIS X 0208 に含まれるもの
        • (※Windows と異なる変換では ¬)
      • JIS X 0212 に含まれないもの
        • ⅰⅱⅳⅴⅵⅶⅷⅸⅹ'"
      • JIS X 0212 に含まれるもの
        • (※Windows と異なる変換では ¦)
    • CJK 統合漢字
      • JIS X 0212 にも JIS X 0213 にも含まれるもの
        • 丨仡伀伃佖侊侒侚侔俉倞倢偀偂偆偰傔兊冝刕劦劯勛匀厓厲咜咩哿喆垬埇埈夋奛奝妤孖寀寘尞岦岺崧嵂嵭嶸嶹弴彧忞悊惕惲愰愷憘抦揵摠撝擎昀昉昕昞昤昱晗晙曻晳暙暠暲暿曺杦枻柀桒桄棈棏楨榘槢樰橆橳橾櫤毖氿汜沆泚洄涇涬淏淼渧渼湜溿澈澵濵瀅瀇炅炫焄焏煆煇煜燁燾犱犾獷珉珖珣琇琦琪琮瑢璉璟甯畯皛皜皦睆砡硎硤禔禛竑竫箞絈絜綷繒纊罇茁荿菇葈蒴蓜蕓蕙裵褜訒訷詹誧誾諟諶賰贒鄧釗釚釤釥釭釮鈊鈐鈹鈺鈼鉀鉎鉑鉙鉧鉸銈銧鋐鋓鋗鋙鋠鋧鋹鋻鋿錂錝錞錡錥鍈鍗鍰鏆鏞鑅隝隯霳靏靕顗顥驎髜魵鮏鮱鰀鵫鵰鸙
      • JIS X 0213 には含まれるが JIS X 0212 には含まれないもの
        • 炻匇匤咊增寬嵓德晥栁橫瀨甁皞礰竧綠緖荢薰譿賴郞鄕霻靍馞魲
      • JIS X 0212 には含まれるが JIS X 0213 には含まれないもの
        • 伹俍俿僘兤冾劜勀卲叝坥墲奓奣巐弡恝惞愑戓昮朎汯浯涖渹猤玽珒珵琩硺羡菶蕫譓軏遧釞鈆鉷鋕鎤鏸鐱鑈靃餧鮻
      • JIS X 0212 にも JIS X 0213 にも含まれないもの
        • 仼僴凬坙峵悅愠敎昻櫢淸淲皂蠇赶閒靑
    • CJK 互換漢字(全て JIS X 0212 に含まれない)
      • 統合漢字として扱うべきもの
        • JIS X 0213 に含まれるもの
          • 﨓﨔﨟﨡﨤
        • JIS X 0213 に含まれないもの
          • 﨎﨣﨨﨩
      • The IBM 32 compatibility ideograph
        • JIS X 0213 に含まれるもの
          • 凞猪神祥福蘒諸都
        • JIS X 0213 に含まれないもの
          • 晴益礼靖精逸飯飼館鶴
      • Pronunciation variants from KS X 1001:1998(すべて JIS X 0213 に含まれる)
        • 朗隆
  • JIS X 0212
  • JIS X 0213:2000
    • 合成文字
      • か゚
    • Unicode 3.0 の文字
    • Unicode 3.2 の CJK 互換漢字
      • 僧免勉勤卑喝嘆器塀墨層屮悔慨憎懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著褐視謁謹賓贈辶逸難響頻
    • Unicode 3.2 の文字
    • Unicode 3.1 の文字(サロゲートペア)
      • 𠀋
  • JIS X 0213:2004
  • Unicode(JIS 外の文字)

参考情報

図をまとめるための情報源について多数あったのですが、まとめきれていないのでいずれ追記 or 別記事にまとめて記載します。まずは文字集合を理解する上で参考になった情報源を挙げておきます。

文字集合エンコーディング、その他用語について、いい感じにまとまっています。上では機種依存文字を分類しすぎて全体像がつかみにくくなっているので、概要が知りたい場合は Windowsの機種依存文字 のページを見るといいかもしれません。

JIS X 0213 のコード表ですが、JIS X 0208 の各規格、JIS X 0213 の各規格、Unicode 3.1/3.2 で追加された文字が色分けされており、イメージがつかみやすいです。ちなみに聖愛中学高等学校のコンテンツで、高校の授業に使われているんだと思います。周辺のコンテンツを見るとかなり充実していて、こんなのを授業で勉強できるのはすごく羨ましいです。

(追記)

いくつか注意書きをするつもりが書き忘れてました。

まず、こんなめんどくさいことを考えたくなければ、システム全体を Unicode 系(UTF-8 とか UTF-16 とか)で統一しましょう。Unicode だけで文字を扱うことができれば、JIS 系の文字集合機種依存文字、MS932 の注意点からは解放されます。(サロゲート・ペアや合成文字、CJK統一文字/CJK互換文字の問題は残りますが。)

あと、上記に挙げた全ての文字種でテストすれば十分かというと、そういうわけではありません。たとえば Shift_JIS では 2 バイト目に \ が入るから問題になりやすいとか、Shift_JISEUC-JP で文字境界を意識しないと意図しない処理になるとか、ASCII では下位 7 bit しか扱わないから \xa5 が \x25 になるとか、そういった部分には一切触れていません。文字集合に絡まない部分については個別にご確認ください。