- PR -

任意の文字が、JIS X 0208に含まれるかを判断するには?

1
投稿者投稿内容
potato
会議室デビュー日: 2008/05/21
投稿数: 2
投稿日時: 2008-05-21 00:37
初めて質問させて頂きます。

Javaで任意の文字が、JIS X 0208の符号化文字集合に含まれているかどうかを判断するメソッドを書きたいのですが、いまいちどうしていいものか良く分かりません。

public static boolean isJISX0208Compliant(char c) {
CharsetEncoder encoder = Charset.forName("x-JIS0208").newEncoder();
return encoder.canEncode(c);
}

このように書いては見たものの、幾つかの文字に対しては、思ったとおりに動きません。例えば、マイナス記号('−'、\uff0d)は、
http://www.asahi-net.or.jp/~AX2S-KMTN/ref/jisx0208.html
で確認する限り、JIS X 0208に含まれるはずなのですが、上記のコードはfalseの値を返します。

何か基本的なことを見逃しているかもしれませんが、ご教授のほど宜しく御願いします。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-05-21 09:20
JIS X 0208 は U+FF0D FULLWIDTH HYPHEN-MINUS を持っていませんので、当然の動作かと思います。JIS X 0208 で '−' に見えるのは U+2212 MINUS SIGN です。

potatoさんが入力にしているデータが、JIS X 0208 の本来のマッピングではなく Microsoft の独自マッピングで Unicode 化された文字なのだと思います。

WAVE DASH - FULLWIDTH TILDE問題
potato
会議室デビュー日: 2008/05/21
投稿数: 2
投稿日時: 2008-05-21 11:03
スフレさん、ご回答有難う御座います!

自分の理解が正しいのか不安なので、確認させてください。スフレさんが仰っていたことは、例え、バックエンドのデータベースに、U+2212 MINUS SIGNとしてデータが保存されていたとしても、Windows上のアプリケーションでその文字を見るときには、既にOSによってU+FF0D FULLWIDTH HYPHEN-MINUSにマップされた後の、'−'が表示されているという理解で正しいでしょうか?

また、Windows上のEclipseから、'−'をハードコードして、下記のisJISX0208Compliantのメソッドを呼んでも、falseが返ってきてしまうのは、同様に'−'をハードコードした時点でWindowsがU+FF0D FULLWIDTH HYPHEN-MINUSにマップしてしまっていて、JIS X 0208にU+FF0Dが存在しないため、falseが返ってくるという理解で正しいでしょうか?

長々と申し訳ありませんが、宜しく御願いします。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2008-05-21 12:57
 詳しくないので正しいか判断できませんが、
http://code.nanigac.com/forum/view/33
のようなサンプルがあります。
 encode処理できるだけでなくちゃんと元にもどらないと対象範囲としてないようです。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-05-21 13:28
引用:

例え、バックエンドのデータベースに、U+2212 MINUS SIGNとしてデータが保存されていたとしても、Windows上のアプリケーションでその文字を見るときには、既にOSによってU+FF0D FULLWIDTH HYPHEN-MINUSにマップされた後の、'−'が表示されているという理解で正しいでしょうか?



バックエンドからWindowsアプリまでの間にどういう変換が行われているかによります。最初から最後までUnicodeならば化けようがありません。
たとえばバックエンドから出すときには公式の JIS X 0208 のマッピングを使って Shift_JIS に変換して、Windows アプリ内で Microsoft 独自マッピングで Unicode 化すると U+FF0D になりますね。

引用:

また、Windows上のEclipseから、'−'をハードコードして、下記のisJISX0208Compliantのメソッドを呼んでも、falseが返ってきてしまうのは、同様に'−'をハードコードした時点でWindowsがU+FF0D FULLWIDTH HYPHEN-MINUSにマップしてしまっていて、JIS X 0208にU+FF0Dが存在しないため、falseが返ってくるという理解で正しいでしょうか?



日本語版 Windows 上であれば、Eclipse/javac は「ソースコードは ms932 で書かれている」とみなし、コンパイル時に '−' を U+FF0D に変換します。Windows が変換しているわけではないのですが、Java コンパイラ内で Windows と同等のマッピングをしています。

potato さんがなぜ isJISX0208Compliant() を作る必要ができたのかを書けば、具体的な対策のアドバイスを(誰かが)できると思います。
1

スキルアップ/キャリアアップ(JOB@IT)