トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

波ダッシュ問題

[カテゴリ:問題]

概要

波ダッシュ問題とは、Shift_JISEUC-JPのようなJIS X 0208ベースのコードからUnicodeに変換する際に、一部の記号の対応するUnicode符号位置がおかしいコード変換の実装がある問題を指します。記号の文字化けの原因となっています。この問題に現れる代表的な記号が波ダッシュであることから、波ダッシュ問題といいます。

一覧

以下に、問題の対象となる文字の一覧を記します。表の中の「文字名」は、JIS X 0208にて規定されている文字名であり、Unicode (ISO/IEC 10646 UCS) の文字名に対応します。「誤り」の変換先に移す実装は、主にMicrosoft Windowsに見られます。

日本語通用名称区点SJIS文字名正しいUnicode符号位置誤り
波ダッシュ1-338160WAVE DASHU+301CU+FF5E
双柱1-348161DOUBLE VERTICAL LINEU+2016U+2225
負符号1-61817CMINUS SIGNU+2212U+FF0D
セント記号1-818191CENT SIGNU+00A2U+FFE0
ポンド記号1-828192POUND SIGNU+00A3U+FFE1
否定記号2-4481CANOT SIGNU+00ACU+FFE2
ダッシュ(全角)1-29815CEM DASHU+2014U+2015

文字化け

上記の「正しいUnicode符号位置」を用いる変換だけを使っている分には問題を生じませんが、誤った変換が混入すると、変換したコードを元のコードに戻そうとした際に対応先がなくて「?」に化けるなどします。

例えば、波ダッシュ(WAVE DASH) SJIS 0x8160をUnicodeに変換する際に、上記の「誤り」の符号位置 U+FF5E (FULLWIDTH TILDE, 全角チルダ) にしてしまうと、変換後のデータを別のプログラムで再びSJISに戻そうとした時に、U+FF5Eに対応するコードがSJISに存在しないために「?」などに化けてしまいます。

こうしたことが生じるケースは、例えば、Unicodeに変換する時にCP932 (MS932, Windows-31Jなど) のような上記の誤った符号位置に移す変換器を用いてしまい、一方、逆方向の変換には Shift_JIS のような正しい変換器を用いた場合です。

対策

この問題を引き起こさないためには、上記「正しい符号位置」への変換を行うコード変換を常に用いることです。

この観点から最も推奨されるのは、Shift_JIS-2004 (Shift_JISX0213)の変換を用いることです。例えばiconvコマンドでは下記のようなオプション指定にてシフトJISからUTF-8へ変換します。

iconv -f SHIFT_JISX0213 -t UTF-8 < sjis.txt > utf8.txt

これにより、正しいUnicode符号位置へ変換されます。この指定は、波ダッシュ問題を避けるだけでなく、丸つき数字やローマ数字等の救済にも効果があり、また第3第4水準漢字やアクセントつきラテン文字などといった日本で使用されている各種の文字への対応という点からも望まれます。

UTF-8からSJISへ変換するには、上の -f と -t を逆にします。

iconv -f UTF-8 -t SHIFT_JISX0213 < utf8.txt > sjis.txt

iconv以外で同様の指定をするには、文字コードを指定する場面で例えばJavaでは "x-SJIS_0213", Pythonでは "shift_jis-2004" とすると、Shift_JIS-2004を指定できます。

一方、"CP932" や "Windows-31J" のようなWindowsのベンダ定義外字の指定を用いると、誤った変換が行われる可能性が高くなるので、用いるべきではありません。(CP932と指定しても、上記の正しい変換を用いる実装もあるので、常に間違った変換が行われるとは限りません)

参考

最終更新時間:2016年10月23日 21時47分13秒