UTF-8における全角マイナスと全角チルダの問題(=いわゆる「波ダッシュ問題」)

以下の通り、同じ文字を表現しているにも関わらず、文字コードが異なるケースが発生します。

[webmaster@localhost work]$ nkf -w sjis.txt > utf8.nkf.txt
[webmaster@localhost work]$ od -tx1 utf8.nkf.txt
0000000 e2 88 92 e3 80 9c
0000006
[webmaster@localhost work]$ vi utf8.term.txt
[webmaster@localhost work]$ cat utf8.term.txt
−〜
[webmaster@localhost work]$
[webmaster@localhost work]$
[webmaster@localhost work]$ od -tx1 utf8.term.txt
0000000 ef bc 8d ef bd 9e 0a
0000007
[webmaster@localhost work]$
[webmaster@localhost zenkaku_minus]$ diff utf8.term.txt utf8.nkf.txt
1c1
< −〜
---
> "0
\ No newline at end of file
[webmaster@localhost zenkaku_minus]$

上記の貼り付けはこの文章をWindows PC上で書いているのでnkf -wで変換したものが文字化けしていますが、実際は以下のSSの通り、見えています。どちらのコードも文字が割り当てられている為、文字化けせずみえてしまうあたりが微妙なところ。



「−(全角マイナス)」を例にとると、Linux上でnfk -wで変換したものはUnicodeの仕様通り「e2 88 92」で構成されていますが、Windows PCからのPuttyなどのターミナル経由での入力はLinuxコマンドライン上で入力したものであっても、Windowsの独自仕様で「ef bc 8d」による表現になります。

LinuxMacWindowsなど複数のOSのクライアントからの入力がある場合は、どれか(≒Windows)を基準にして他をはじくか、統一する為に変換するなどの対応が必要で、他にどれだけこういう文字があるのかという体系立てた調査結果を探しましたが、当方ではWeb上で見つけられませんでした。*1


追記(6/19):

コメントをいただいた事をきっかけに、Unicode仕様とWindows実装(JIS X 208等への準拠)との間での不整合についていくらか経緯・事情を理解しました。


私が書いた内容は「波ダッシュ問題」としてさんざん既知の問題で、Wikipediaをみると以下のように項目を設けて解説があります。

http://ja.wikipedia.org/wiki/Unicode#.E6.97.A5.E6.9C.AC.E8.AA.9E.E7.92.B0.E5.A2.83.E3.81.A7.E3.81.AEUnicode.E3.81.AE.E8.AB.B8.E5.95.8F.E9.A1.8C
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C


おそらく有名なエピソードかと思われますが、上記の「波ダッシュ」項の以下の解説が興味深かったです。「興味深かった」とか悠長にいえる他人事の話ではないのですが、「仕様を決めるのは(当たり前ですが)人間なんだな」という感じがしたというか。

このような間違いが発生した理由は、Unicodeの例示字形を検討するグループにいたメンバーの日本語に対する知識が不十分だったために、縦書きの例示字形「」を90度回転すればいいと誤って判断してしまったためである。


以下のウェブサイトではJcode.pmにおけるこの問題への対応について解説がありました。

http://www.fiberbit.net/user/hobbit-t/html/jcode.html


網羅的に対処するとなると、Unicode Consortiumが提供しているJIS規格とUnicodeのコード変換表を元に対応という事になるようです。

ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0208.TXT


追記(6/20):

このエントリで挙げた例ではShift_JISのファイルをnkf -wでUTF-8に変換して問題が発生しています。

コメントにてid:nurse様に教えていただいたのですが、これについては以下のようにオプションを明示する事でWindows互換での変換となるので、実行する環境を問わずこのように統一する方がよいようです。

[webmaster@localhost work]$ nkf --ic=CP932 --oc=UTF-8 sjis.txt > utf8.nkf.txt
[webmaster@localhost work]$ od -tx1 utf8.nkf.txt
0000000 ef bc 8d ef bd 9e
0000006
[webmaster@localhost work]$

nkf --helpをみると以下のように説明があります。

Long name options
 --ic=<input codeset>  --oc=<output codeset>
                   Specify the input or output codeset

*1:一般的に入力の可能性が高いのはこの二つのようですが