Vista で導入される JIS X 0213:2004(JIS2004) のまとめ(お勉強編)
「日本語文字セットがVista最大の問題として急浮上:ITpro」 が初めのネタになったのですが、なかなか時間もとれず、この記事を書き始めてはや3週間も経ってしまいました・・・orz
〜中略〜
さらに、追加される新しい文字の一部をUnicodeで表現すると、通常の2バイトではなく4バイトで表現されるものがある。をみて、SJIS → UTF-8 → SJIS とかやると文字化けするものとかでるじゃん!大丈夫だっけ?大丈夫じゃなかったら、どんな対策をとったらいいんだっけ?ってのを考察しています。まずはお勉強編。文字コード関連のお話し、読めば読むほど面倒くさい。
さて、普段は Jcode.pm とか Encode.pm に任せっきりで文字コードのことをマジメに勉強したこともなかったので、まずは基礎知識として JIS2004 について勉強しました。このあたりが参考になりました。
- JIS X 0213 - Wikipedia / JIS X 0208 - Wikipedia
- JIS X 0213の代表的な符号化方式
- JIS2000情報
- 新漢字則(JIS X 0213:2004)
- 小形克宏の「文字の海、ビットの舟」――文字コードが私たちに問いかけるもの
- Vistaで化ける字,化けない字:ITpro
で、つぎに Windows Vista での JIS2004 対応関連の情報を収集。ここら辺を読めば大丈夫。
で、結局いろいろな情報を集めましたが、文字コード規格の基礎的な知識をひとまず整理。ほとんどウィキペディアからの情報ですが・・・
JIS X 0208 について
JIS X 0208は、1978年に日本工業規格 (JIS) で規定され、1983年、1990年、1997年に改定された、日本語の文字集合および文字符号化方式を定めた規格。1997年版の正式名称は、「7ビット及び8ビットの2バイト情報交換用符号化漢字集合」。俗に「JIS第1第2水準漢字」などと呼ばれる。日本で最も古い公的な符号化文字集合であり、記号、アルファベット、漢字など6,879字を収録、標準的な漢字の大半がJIS X 0208に含まれている。EUC-JP、Shift JIS、ISO-2022-JPなどの日本語文字コードは、JIS X 0208の文字集合に対する文字符号化方式である。
初期のコンピュータは、規定された漢字を全て搭載することが難しかったため、より使用頻度の高い第一水準と、拡張的な第二水準とに分かれていた。また2バイトのうち、各1バイトの0x21〜0x7E領域で文字集合を表現するため、94点で構成される区が94区ある。
1997年の最終版では、非漢字:524字、第一水準漢字:2,965字、第二水準漢字:3,390字の計6,879字が規定されている。
・ 非漢字(記号、英数字、ひらがな、カタカナ、ギリシャ文字、ロシア文字、罫線)
区点コード: 1区1点 - 8区32点
・ 第一水準漢字
区点コード: 16区1点 - 47区51点
・ 第二水準漢字
区点コード: 48区1点 - 84区6点
JIS X 0213(JIS2000) について
JIS X 0213はJIS X 0208:1997を拡張した日本語の文字コード規格。2000年に制定、2004年に改正された。規格名称は「7ビット及び8ビットの2バイト情報交換用符号化拡張漢字集合」。通称「JIS2000」「2000JIS」などと呼ばれる。互換性のない新たな拡張であることから「新拡張JISコード」と呼ばれることもある。文字コードで運用する必要性の高い4,354字が追加され、計11,233字である。拡張に当っては、JIS X 0208の1997年改訂で保留領域とされた部分に字を増やす方針で行われ、非漢字659字、第三水準として1,249字、第四水準として2,436字を追加した。実装では、JIS X 0208:1997で保留領域とされた部分に第三水準の文字を入れて第一面とし、その後ろに第四水準の文字を第二面として加えた。さらに2004年の改正で、第三水準に10字が追加、168字の例示字形が変更された。
JIS X 0213:2004(JIS2004)の説明
JIS X 0213:2004は、JIS X 0213:2000の例示字形を変更している。変更があったのは、「逢芦飴溢茨鰯淫迂厩噂餌襖迦牙廻恢晦蟹葛鞄釜翰翫徽祇汲灸笈卿饗僅喰櫛屑粂祁隙倦捲牽鍵諺巷梗膏鵠甑叉榊薩鯖錆鮫餐杓灼酋楯薯藷哨鞘杖蝕訊逗摺撰煎煽穿箭詮噌遡揃遜腿蛸辿樽歎註瀦捗槌鎚辻挺鄭擢溺兎堵屠賭瀞遁謎灘楢禰牌這秤駁箸叛挽誹樋稗逼謬豹廟瀕斧蔽瞥蔑篇娩鞭庖蓬鱒迄儲餅籾爺鑓愈猷漣煉簾榔屢冤叟咬嘲囀徘扁棘橙狡甕甦疼祟竈筵篝腱艘芒虔蜃蠅訝靄靱騙鴉」。また、JIS X 0213:2004は、JIS X 0213:2000 に10 文字追加している。追加があったのは、SJIS コードで「879F 889E 9873 989E EAA5 EFF8 EFF9 EFFA EFFB EFFC」。Windows Vista の Font はこの JIS2004 に対応したということである。
Windows NT 系列の日本語入出力について
Windows の日本語を処理のフェーズは以下のようになっている。漢字入力 → 漢字変換(IME、ATOK) → NLS → OS 内部 → NLS → フォント変換 → 画面出力
※NLS:Neutral Langurage System
Windows NT は多国言語対応をするために内部処理に Unicode を採用が、漢字辞書やフォントに関しては Windows 3.1を流用するため、入出力はシフトJISとなっている。Windows2000以降も同様。Windows XP を X0213 に対応するためには、
・ 対応した漢字辞書(漢字変換システム) → Vista から採用された IME 2007 等
・ 対応したフォント → Vista から採用されたメイリオ等
・ Windows NT/2000/XPの場合は対応したNLS → Vista も非対応?
が必要。NLS の X0213 対応とは C:\WINDOWS\system32 にある c_932.nls (932とは日本語コードページ番号)というバイナリファイルを X0213 になるように hack すればよいらしい。ただし、X0213 の一部コードが Windows 機種依存文字とかぶるので、Windows 機種依存文字は使用不可になる。詳細は新漢字則(JIS X 0213:2004)をどうぞ。
試しに NLS を X0213 に対応させて、シフトJIS 2004 のコード一覧を作ってメイリオで表示させてみたら、表示されるべき所はほとんど全て表示されるようになりました。
use strict; use warnings; open my $fh1, '>Sjis2004.txt' or die 'can not create file'; foreach my $i (0x8140..0x8FFF, 0x9040..0x9FFF, 0xE040..0xEFFF, 0xF040..0xFCFF) { next if (($i & 0xFF) < 0x40); print $fh1 sprintf("%x:",$i) if ($i % 16 == 0); if (($i & 0xFF) == 0x7f || ($i & 0xFF) >= 0xfd && ($i & 0xFF) <= 0xff) { print $fh1 ' '; } else { print $fh1 pack("C2" ,$i >> 8, $i & 0xFF); } print $fh1 "\n" if ($i % 16 == 15); } close $fh1;
ちなみに、入力が Unicode であれば、Unicode 表示する場合に NLS を通らないためか、上記の hack をやらなくても X0213 文字コードも正しく表示することができました。
例)Vista の IE7+IME2007を使って、Unicode な web ページで X0213 の文字を入力してみるとちゃんとでるみたい。また、Unicode じゃない web ページの場合は、UTF-8コードを 桁数値; にエンティティ化して送信してるっぽい。
取りあえず、お勉強編はここまで。
コメントやシェアをお願いします!