ひきこもりプログラマ

C++のこととか。

ICUがDICOMの半角カナを正しくUnicodeに変換できない

2012-09-27 | Program

PS 3.3 - 2011 の Table C.12-3 DEFINED TERMS FOR SINGLE-BYTE CHARACTER SETS WITH CODE EXTENSIONS によると,JIS X 0201: Katakana を使う際の ESC sequence は「ESC 02/09 04/09」となっています。これはつまり G1 working set に1バイトカタカナを指示(designate)しているわけで,DICOMでは8ビットモードを使ってねという話を考えるとなにもおかしくないのですが,ICU 4.8 でこのエスケープシーケンスから始まる半角カナをUnicodeに変換すると,エスケープシーケンスがまるっと残ってしまいます。8ビットモードなのでucnv_openに渡すconverter名は「JIS8」なのですが,どうもこいつは「カタカナをG1にってそんなんいちいち指示しなくても最初から割り当てられてますやん。そんな指示意味ないですやん」と判断しているご様子。ちょっといまソースコード読む気力がないので推測なんですが。

というわけで上述のエスケープシーケンスはICUに渡す前に「ESC 02/08 04/02」あたりに変換しておくとよいようです。

※日本語なんだから「ESC 02/08 04/10」でいいんじゃないのとも思ったのですがこれだとバックスラッシュが円記号(U+00A5)に変換されてしまってたぶんまずいことになります。