文字コード
[カテゴリ:メモ]
[カテゴリ:文字コード]
メモ
JIS/SHIFTJISとWINDOWS/CP932との相違 [2001-07-08]
http://homepage1.nifty.com/nomenclator/unicode/sjisdiff.txt
シフトJISからUnicodeへの変換テーブルの相違 1999年6月9日更新
http://www.autumn.org/etc/unidif.html
Unicode問題
http://www.atmarkit.co.jp/fxml/rensai/xmlwomanabou06/learning-xml06.html
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%A4%E3%83%AA%E3%82%AA
http://www.shuiren.org/chuden/teach/code/index-j.html
Han Unification 問題・コードセパレート問題
¥問題、他エンコードとの変換テーブル問題、
RFC2279に記述されているのセキュリティ問題
葛 メイリオ
utf8以外の文字削除
http://www2d.biglobe.ne.jp/~msyk/cgi-bin/charcode/bbs.cgi?past=1&c=r&n=82
http://www.akanko.net/marimo/data/rfc/rfc2279-jp.txt
基礎
UTF-16、UTF-8とか
UCSとUTFとは? [2003-11-11]
# UTF-16,BOM などの説明
http://homepage1.nifty.com/nomenclator/unicode/ucs_utf.htm
Unicode - Wikipedia:
# YEN SIGN問題、WAVE DASH - FULLWIDTH TILDE問題 の解説あり
http://ja.wikipedia.org/wiki/Unicode
UCS(Universal Character Set coded )
多言語文字コードセット
UCS-2は16bitの文字領域を持つ
UCS-4は31bitの文字領域を持つ
UTF(Unicode Transformation Format)
符号化方式
UTF-8、UTF-16とか
¥記号問題
¥記号 - Wikipedia:
http://ja.wikipedia.org/wiki/%EF%BF%A5%E8%A8%98%E5%8F%B7
まとめ。
発端の米国では ASCIIコード
128文字(7bit)の領域を持ち、アルファベット他を割り当て
うち12文字は各国で自由に決めてよいことになっていた。
日本では JIS X 0201(その後、Shift_JISへ)
ASCIIコード(7bit)を拡張して8bitとした上で、半角カナを追加割り当てした。
さらに、各国で自由に決めることができた12文字の1つであった
0x5cに『¥』を割り当てた。
これにより、
同じ0x5cであっても、米国PCでは画面上『\』として見え、
日本PCでは『¥』として見えることになった。
ヨーロッパでは ISO8859
ASCIIでは表現できないヨーロッパ言語への対応。
512文字(8bit)の領域を持つ。
ISO8859-1において0xa5が『¥』に割り当てられる。
この時点で・・・
ASCIIコードでは、0x5cは『\』
JIS X 0201 では、0x5cは『¥』
ISO8859-1 では、0x5cは『\』、0xa5が『¥』
という状況になる。
Unicodeへの統合
世界の文字をUnicodeに統合しようとする流れの中、
Shift_JIS(他日本語の文字セット含む)上における0x5cは見た目『¥』で
あるので、Unicodeでは YEN SIGN(U+00A5)に割り当てられた。
本題の¥記号(YEN SIGN)問題とは?
ところが、0x5cはOSやプログラミング言語において特殊な文字として利用されている為、
例えば、C言語をShift_JISで以下のように記述していた場合、
printf(”abc¥n”);
これをUnicodeに変換すると、*見た目*は全く変化なく
printf(”abc¥n”);
に変換される。
ところが*文字コードレベル*で考えると、Shift_JISの『¥(0x5c)』は
Unicode(より正確には、ここではUTF-8)の『¥(0xa5)』となるため、C言語上の
意味として持っていた『¥n=改行』が失われてしまうことになる。
つまり、過去Shift_JISで書かれたプログラミングソースをUnicode(UTF-8)へ変換
すると、制御コードである0x5cが別コードに変わってしまうため、コンパイルが
通らないなどの不具合を生じる。
現実的にはどうしてるのか?
過去の遺産が使えなくなるのは致命的なので『Unicodeを利用するアプリケーション
は0x007F以下のコードに関しては移動させない』と言う暗黙のルールができている。
ただ、そうすると、Shift_JISの以下コードを
printf(”abc¥n”);
Unicodeに変換すると、
printf(”abc\n”);
になりそうだが、Windowsの場合「0x5c のフォントデータに
『\』ではなく『¥』の字形を割り当て」ることで*見た目*は
printf(”abc¥n”);
を維持している。
つまりどういうことか?
世界の文字をUnicodeに統一して、世界中どのPCを使っても
見た目が同じになるはずだったのに、
日本PCで『¥100』と書いたものが、米国PCでは『\100』に見えるということです。
もっとも、Htmlで書くのであれば『¥ 100』とか『¥ 100』とすれば、
日本でも米国でも『¥100』で見えるっぽいです。
Shift_JIS(=CP932)は1種類ではない
Microsoftコードページ932 - Wikipedia:
http://ja.wikipedia.org/wiki/Microsoft%E3%82%B3%E3%83%BC%E3%83%89%E3%83%9A%E3%83%BC%E3%82%B8932
まとめ。
MS-DOSの時代
Microsoftは、CP932の実装をOEMメーカに任せていた。
IBMのCP932、NECのCP932、富士通のCP932 などたくさんの実装ができてしまった。
Windows3.1の時代
Microsoftが、CP932の実装を自社で行うことにした。
当時特にシェアが多かったIBM・NECのCP932を統合し『Windows-31J』と名づけた。
現在
CP932(=Shift_JIS)といえば『Windows-31J』を指すようになった。
ただし、Javaでは『CP932=IBMのCP932実装』を『MS932=Windows-31実装』を指す。
ps.
Mac・iモードもShift_JISであるが、イコールWindows-31Jではない。
Microsoft標準日本語文字セット(Windows3.1以降)
Microsoft標準日本語文字セット - Wikipedia:
http://ja.wikipedia.org/wiki/Microsoft%E6%A8%99%E6%BA%96%E6%97%A5%E6%9C%AC%E8%AA%9E%E6%96%87%E5%AD%97%E3%82%BB%E3%83%83%E3%83%88
まとめ。
3バージョンが存在する。
Win3.1/95、NT3.1/3.5/4の時代
『Windows-31J』を実装
符号化方式としては、Shift_JIS、拡張EUC-JP、拡張ISO-2022-JP を利用可
Win98/Me/2000/XP/2003の時代
『Windows-31J』+『JIS X 0212』+『Unicodeの無国籍記号』を実装
符号化方式としては、UTF-16、UTF-8、UTF-7 を利用可
Windows-31Jの文字集合はこのバージョンのサブセットでもあるため、
このサブセット領域内に限り、Shift_JISを用いても符号化できる。
WinVistaの時代
『Windows-31J』+『JIS X 0212』+『Unicodeの無国籍記号』+『JIS X 0213-2004』を実装
符号化方式としては、UTF-16、UTF-8、UTF-7 を利用可
重複文字(波ダッシュ・全角チルダ問題)
Unicode - Wikipedia
http://ja.wikipedia.org/wiki/Unicode#.E6.B3.A2.E3.83.80.E3.83.83.E3.82.B7.E3.83.A5.E3.83.BB.E5.85.A8.E8.A7.92.E3.83.81.E3.83.AB.E3.83.80.E5.95.8F.E9.A1.8C
UTF-8→SJIS/EUC-JPの重複文字をまとめてみた - hnwの日記
http://d.hatena.ne.jp/hnw/20090503
MECSUtils リファレンス [Delphi Programming]
http://ht-deko.minim.ne.jp/tech021.html#MecsMappingFix_UnicodeToJISX0208
マニアックなプログラミング備忘録
http://space.geocities.jp/nequomame/java/mojibake/mojibake_01.html
[PRB] SHIFT - JIS と Unicode 間の変換問題
http://support.microsoft.com/default.aspx?scid=kb;ja;JP170559
シフトJIS / EUC-JPとUnicodeとの妥当な変換表 | Netsphere Laboratories
http://www.nslabs.jp/round-trip.rhtml
iconv
/usr/lib/gconv/gconv-modules
# from to module cost alias EUCJP-MS// EUC-JP-MS// alias EUCJP-OPEN// EUC-JP-MS// alias EUCJP-WIN// EUC-JP-MS// module EUC-JP-MS// INTERNAL EUC-JP-MS 1 module INTERNAL EUC-JP-MS// EUC-JP-MS 1 # from to module cost alias EUCJP// EUC-JP// alias CSEUCPKDFMTJAPANESE// EUC-JP// alias OSF00030010// EUC-JP// alias UJIS// EUC-JP// module EUC-JP// INTERNAL EUC-JP 1 module INTERNAL EUC-JP// EUC-JP 1 : # from to module cost alias SHIFT-JIS// SJIS// alias SHIFT_JIS// SJIS// alias MS_KANJI// SJIS// alias CSSHIFTJIS// SJIS// module SJIS// INTERNAL SJIS 1 module INTERNAL SJIS// SJIS 1 # from to module cost alias WINDOWS-31J// CP932// alias MS932// CP932// alias SJIS-OPEN// CP932// alias SJIS-WIN// CP932// alias CSWINDOWS31J// CP932// module CP932// INTERNAL CP932 1 module INTERNAL CP932// CP932 1
検証コード
( func_test() { local _code=$1 echo "***" echo "*** ${_code}" echo "***" echo ">>> utf-8" echo -en ${_code}; echo "" echo -en ${_code} | od -An -tx1 | head -n 1 echo ">>> utf-8 -> utf-32le//TRANSLIT" echo -en ${_code} | iconv -f utf-8 -t utf-32be//TRANSLIT | od -An -tx1 | head -n 1 echo ">>> utf-8 -> euc-jp//TRANSLIT" echo -en ${_code} | iconv -f utf-8 -t euc-jp//TRANSLIT | od -An -tx1 | head -n 1 echo ">>> utf-8 -> euc-jp//TRANSLIT -> utf-8" echo -en ${_code} | iconv -f utf-8 -t euc-jp//TRANSLIT | iconv -f euc-jp -t utf-8; echo "" echo -en ${_code} | iconv -f utf-8 -t euc-jp//TRANSLIT | iconv -f euc-jp -t utf-8 | od -An -tx1 | head -n 1 echo ">>> utf-8 -> euc-jp-ms//TRANSLIT" echo -en ${_code} | iconv -f utf-8 -t euc-jp-ms//TRANSLIT | od -An -tx1 | head -n 1 echo ">>> utf-8 -> euc-jp-ms//TRANSLIT -> utf-8" echo -en ${_code} | iconv -f utf-8 -t euc-jp-ms//TRANSLIT | iconv -f euc-jp-ms -t utf-8; echo "" echo -en ${_code} | iconv -f utf-8 -t euc-jp-ms//TRANSLIT | iconv -f euc-jp-ms -t utf-8 | od -An -tx1 | head -n 1 echo ">>> utf-8 -> cp932//TRANSLIT" echo -en ${_code} | iconv -f utf-8 -t cp932//TRANSLIT | od -An -tx1 | head -n 1 echo ">>> utf-8 -> cp932//TRANSLIT -> utf-8" echo -en ${_code} | iconv -f utf-8 -t cp932//TRANSLIT | iconv -f cp932 -t utf-8; echo "" echo -en ${_code} | iconv -f utf-8 -t cp932//TRANSLIT | iconv -f cp932 -t utf-8 | od -An -tx1 | head -n 1 } echo "***************************************************************************" func_test "\x5c" func_test "\xc2\xa5" func_test "\xef\xbf\xa5" echo "***************************************************************************" func_test "\x7e" func_test "\xe2\x80\xbe" func_test "\xef\xbf\xa3" echo "***************************************************************************" func_test "\xe2\x88\x92" func_test "\xef\xbc\x8d" echo "***************************************************************************" func_test "\xe3\x80\x9c" func_test "\xef\xbd\x9e" )
最終更新時間:2014年07月08日 09時26分51秒