マイナスが文字化け

ことの起こりは...
a-blogというブログ作成パッケージを使って、 友人のブログを構築している時のこと。 カスタマイズするモジュールがいくつか公開されていて、 そのモジュールを処理していると思われるときに、 不正な文字があるというメッセージが表示される。
a-blogの他の部分のソースは非公開なので、 (どこかに出力されているかもしれない)ログをたよりにプログラムを追いかける という外科的な診断はできない。 カスタマイズの状況をかえながら、発生する現象を観察する という内科的な方法を試みた。 カスタマイズ用のモジュールの文字化けが原因とのベンダからのアドバイスをうけて、 そのモジュールを Java 5.0 で読み込みコンソールに表示してみた。 エディタ(秀丸エディタ 4.14)では普通に表示されている全角マイナスが、 コンソールには、? と表示されているではないか。
そういえば、 Unicode と コードページ936 の間で非可換な変換 があったなぁ。
表1
UNICODE名称字形シフトJIS
U+2014EM DASH 2014.gif X'3F'
U+2015HORIZONTAL BAR 2015.gif X'815C'
U+2016DOUBLE VERTICAL LINE 2016.gif X'3F'
U+2212MINUS SIGN 2212.gif X'3F'
U+2225PARALLEL TO 2225.gif X'8161'
U+301CWAVE DASH 301C.gif X'3F'
U+FF0DFULLWIDTH HYPHEN-MINUS FF0D.gif X'817C'
U+FF5EFULLWIDTH TILDE FF5E.gif X'8160'

この表は、Unicode で表現された4つの符号が、Shift_JIS の ? に変換されるという説明です。 その他の情報は参考までにといった程度。
字形は The Unicode character Code Charts By Script から引用
字形をクリックすると別ウィンドウに拡大されます。

ということで、普段使っているマイナスについて調べてみました。

プログラム TestMinus.java

Microsoft Windows XP Professional 上で かな漢字変換{(IME スタンダード 2003)する際、 キーボードのマイナスを押したときに表示される候補のうちの全角のもの(4種)をデータにしました。 比較の基準としてプラスを採用しました。こちらは変換の候補は全角と半角1文字ずつでシンプルなものです。

TestMinus-1.gif

テキストの左からプラス、[全]マイナス、[全]ダッシュ、[全]ハイフン、[全]長音の順。 半角のマイナスは対象外です。

念のため入力ファイルをダンプしてみましょう。
TestMinus-4.gif
[全]ハイフンが 815D (字形については次表)に符号化されています。 コードをEUCにしたデータも用意しました。
TestMinus-5.gif
実行結果は、Shift_JISEUC-JP のいずれも下記のようになります。
TestMinus-2.gif   TestMinus-3.gif
ラベルの文字は表示されますが、マイナスとダッシュはDOS画面に ? が表示されます。 DOS画面の出力をリダイレクトしてダンプをとってみます。
TestMinus-6.gif
まとめてみましょう。
表2 
MSEの呼称 字形 入力 内部コード 出力
[全]プラス 817B FF0B817B
[全]マイナス817C 22123F
[全]ダッシュ815C 20143F
[全]ハイフン815D 2010815D
[全]長音 815B 30FC815B

出力は表1どおりで問題はなさそうです。 ここで腰をすえて、JIS漢字字典 でマイナスに「弁似」している文字をリストアップしました。 表3の2から10の9個です。 11番目は表1からの引き写しです。 Windows Codepage 932Windows 932_81 を参照すると、Windows のコードページ 932 では Shift_JIS X'817C' と Unicode U+FF0D とが対応することがわかります。

表3 
 字形名称注1 区点注2 GL注3 GR注4 Shift_JIS UCS ASCII注6
1 正符号、加算記号 1-60 215C A1DC 817B 002B 2B 002Bs.gif
2 負符号、減算記号 1-61 215D A1DD 817C 2212   2212s.gif
3 ダッシュ(全角) 1-29 213D A1BD 815C 2014   2014s.gif
4 ハイフン、マイナス 1-2-17 2231 A2B1 81AF 002D 2D 002Ds.gif
5 長音記号 1-28 213C A1BC 815B 30FC B0 30FCs.gif
6 ハイフン(四分) 1-30 213E A1BE 815D 2010   2010s.gif
7 -二分ダーシ、ダッシュ(二分) 1-3-92 237C A3FC 829C 2013   2013s.gif
8 横細線素片 8-01 2821 A8A1 849F 2500   2500s.gif
9 横太線素片 8-12 282C A8AC 84AA 2501   2501s.gif
10 -ソフトハイフン注5 1-09-09 2929 A9A9 8548 00AD AD 00ADs.gif
11         817C FF0D   FF0Ds.gif

注1 JIS X 0213:2000 で定める日本語通用名称
注2 区点または面区点番号。 区点番号は JIS X 0208:1997 に収録されている文字、 面区点番号は JIS X 0213:2000 に収録されている文字であることを示します。 文字集合については 講義録8.5に簡単な解説があります。
注3 GL領域用符号。ISO-2022-JP で採用しています。 講義録8.6に簡単な解説があります。
注4 GR領域用符号。EUC-JP で採用しています。
注5 ソフトハイフンは、 行末に現れたときにハイフン(または似た字形の文字)を表示し、 それ以外の場所では非表示となります。 JIS X 0213 では常にハイフンとして表示することを許容しています。
注6 The Unicode character Code Charts By Script から字形を拾いました。クリックすると別ウィンドウで(ちょっとだけ)拡大されます。
このほかにも UnicodeGeneral Panctuation には、u+2011(NON-BREAKING HYPHEN) 2011s.gifu+2012(FUGURE DASH) 2012s.gifu2015(HORIZONTAL BAR) 2015s.gif がならんでいます。

TestMinus-7.gif


Top Page
更新日:2006/03/27