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

文字コード

[カテゴリ:メモ]
[カテゴリ:文字コード]

メモ

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秒