アクセスカウンタ

zoom RSS テーマ「文字コード」のブログ記事

みんなの「文字コード」ブログ


「[區鳥]」が「乗ス」に化けるメカニズム

2006/11/11 17:29
IE7と補助漢字(「森鴎外」と「森鷗外」): WEBプログラミング NOW!
<<補助漢字をサポートしているアプリケーションは、実際のところ少ない。>>
この補助漢字(JIS X 0212-1990)は、天下の秀丸エディタがver. 6.0になってやっとサポートするようになったことからも分かりますように、サポートしているアプリケーションは、現在のところ少ないです。

例えば、Firefoxではサポートしていますが、IEではIE7になってもサポートされていません。せっかく秀丸エディタでEUC-JPの補助漢字をサポートするようになっても、IEでは文字化けします。「繫がる」が「恕リがる」にIEでは文字化けします。明治の文豪・「森鷗外」は「森乗ス外」に文字化けします。


IE で EUC-JP ページの「森鷗外」を表示させると「鷗」が「乗ス」に化けるメカニズムを考えてみましょう。

前提知識

IE のように、国際化されたソフトウェアでは、内部処理を Unicode でして、各種エンコーディングと Unicode の変換を行うことで、多種多様なエンコーディングに対応しています。その際、Windows では、エンコーディング変換を API で、あらかじめ用意しています。個々のエンコーディングは、コードページで指定し、シフトJIS、日本語EUC、7ビットJISコードの、それぞれのコードページは、932、51932、50220(50221,50222) となっています。

IE に限らず、Windows 用の国際化されているソフトウェアは、Windows が用意している API を使うようにする事により、自前でエンコーディング変換を用意せずにすみます。しかし、Windows の変換 API で指定するコードページでサポートされていない文字、今回の場合であれば、コードページ51932 (以後、CP51932 とします) でサポートされていない JIS X 0212-1990 補助漢字は、正しく変換できないという事になります。

CP51932 と Unicode との変換の実現方法

各種の実験により、Windows では、次のような変換を行っていると推測されます。(Windows2000 Professional で確認)

CP51932 → Unicode
  1. 文字列をアルゴリズム的変換で EUC から SJIS に変換
  2. CP932 から Unicode に変換
Unicode → CP51932
  1. Unicode から CP932 に変換
  2. IBM拡張文字(115区〜119区) の文字を NEC選定IBM拡張文字 (89区〜92区) の文字に置換
  3. アルゴリズム的変換により、SJIS から EUC に変換


「鷗」が「乗ス」に化けるメカニズム

問題となっているのは、EUC-JP のページで、「鷗」を JIS X 0212 補助漢字を使って、\x8F\xEC\xBF で表現し、それを IE で表示すると、「乗ス」に化けて表示されるというケースです。

IE は内部処理を Unicode で行っているため、EUC を CP51932 → Unicode 変換しています。「CP51932 と Unicode との変換の実現方法」で示した方法を実際に適用してみます。
  1. \x8F\xEC\xBF をアルゴリズム的変換で EUC から SJIS に変換します。
    • この際、Windows では、JIS X 0208 の94(区)×94(点)の範囲外のコードポイントは、変換されずに SJIS 文字列の中に残るような変換をします。
    • その事を踏まえると、\x8F はそのまま残し、次のように変換されます。
    • \x8F → \x8F
    • \xEC\xBF → \xE6\xBD
  2. \x8F\xE6\xBD を CP932 から Unicode に変換
    • \x8F\xE6 → U+4E57 (乗)
    • \xBD → U+FF7D (ス)

「鷗」が「乗ス」に化けました!

ポイントは、アルゴリズム的変換で EUC から SJIS に変換する際に、変換できないコードポイントを他の文字に置換するなどの処理をせずに、SJIS 文字列の中に残してしまっている事です。

Unicode → CP51932 の変換でも同様の処理をしているため、U+E000〜U+E757 のユーザー定義文字を変換すると、EUC 文字列中に SJIS のコードポイントでユーザー定義文字が紛れてしまうという問題がありますのでご注意ください。
記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 9 / トラックバック 0 / コメント 2


eucJP-ms と CP51932 の違い

2005/11/04 03:44
画像
eucJP-ms と cp51932 は、両方とも、EUC-JP をWindows標準キャラクタセットの文字を扱えるようにしたもので、それぞれ次のような拡張が行われています。

eucJP-ms は、オープン・グループ / 日本ベンダ協議会 が定義したもので、EUC-JP のコードセット1 (JIS X 0208) に、13区 NEC特殊文字と 85区〜94区には、ユーザー定義文字を追加し、コードセット3 (JIS X 0212 補助漢字) では、JIS X 0212 で定義されている文字は、JIS X 0212 のコードポイントを用い、足りない文字を 83区〜84区に追加、85区〜94区にユーザー定義文字を追加しています。

一方、cp51932 は、マイクロソフトが定義したもので、EUC-JP のコードセット1 (JIS X 0208) に、13区 NEC特殊文字と 89区〜92区には、NEC選定IBM拡張文字を追加して、コードセット3のJIS X 0212 は用いません。
また、ユーザー定義文字は、コードセット3は使わないため、コード領域が足りず扱えないということになります。

注意点としては、ユーザー定義文字を扱えるかどうかという事と、JIS X 0208 の 85区〜94区のコード割り当てが eucJP-ms と cp51932 とで異なるという事です。cp51932 の文字列を eucJP-ms によって UTF-8 などに変換してもエラーにはなりませんが、NEC選定IBM拡張文字が、ユーザー定義文字に化けてしまいますので御注意ください。

以上のように、eucJP-ms は、Windows で使われている cp51932 とは、異なるものなので、いわゆる機種依存文字を EUC-JP 符号化方式で処理する場合は、細心の注意を払って使用するようにする必要があります。

Windows の API で、cp51932 の文字コード変換する場合は、MultiByteToWideChar(), WideCharToMultiByte() ではなく、MLANG.DLL の ConvertINetMultiByteToUnicode(), ConvertINetUnicodeToMultiByte() でなければ、変換できません。

記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 12 / トラックバック 8 / コメント 0


[libiconv] KaoriYa 配布の libiconv 1.10-20051016

2005/11/02 02:40
http://kaoriya.net/
cp932 は、ユーザ定義文字には未対応、NEC選定IBM拡張文字優先。
euc-jp は、cp51932 になっているようです。

libiconv-1.10-ja-1.patch.gzでの環境変数 CHARSET_ALIAS は、vim 対応のために実装したので具体的にvimの日本語文字コード処理の問題点と回避方法という事で、例を示すべきだったのかも。
記事へブログ気持玉 / トラックバック / コメント


[Sylpheed] NEC選定IBM拡張文字対応が取り込まれました。

2005/10/15 19:33
http://tmtm.org/cgi-bin/w3ml/sylpheed-jp/msg/3166
ありがとうございます。

Unicode 化されたソフトの多くが、実用面から Windows 機種依存文字対応を行なっていく事で、Windows 以外の OS でも文字化けしなくなりますね。

Unicode は、確かにデメリットがあるかもしれませんが、このようなメリットもあり上手く付き合って行きたいものです。
記事へブログ気持玉 / トラックバック / コメント


Citrus iconv パッチ

2005/10/15 17:55
なるせさんのテスト結果 で NetBSD 2.0.2 Citrus iconv の cp932, euc-jp-ms の変換に不具合のあることが判明しましたので、パッチを作成しました。
あらたに、euc-jp, euc-jp-ms の JIS X 0201 片仮名に関して UCS からの変換に不具合があったので、一緒になおしておきました。

元になるソース
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-2.0.2/source/sets/src.tgz
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-2.0.2/source/sets/sharesrc.tgz

パッチ
http://www2d.biglobe.ne.jp/~msyk/software/citrus/netbsd-2.0.2-csmapper.patch
http://www2d.biglobe.ne.jp/~msyk/software/citrus/netbsd-2.0.2-ja-enc.patch

パッチのあてかた
cd /tmp
ファイルをダウンロード
cd /
tar ztvf /tmp/src.tgz src/lib/libc/citrus src/lib/i18n_module
tar zxvf /tmp/sharesrc.tgz src/share/i18n/csmapper
cd /usr/src
patch -p0 < /tmp/netbsd-2.0.2-csmapper.patch
patch -p0 < /tmp/netbsd-2.0.0-ja-enc.patch


メイク&インストール
cd /usr/src/lib/i18n_module/MSKanji
make USETOOLS=no dependall install
cd ../EUC
make USETOOLS=no dependall install
cd /usr/src/share/i18n/csmapper
make USETOOLS=no dependall install
記事へブログ気持玉 0 / トラックバック 0 / コメント 2


Citrus iconv

2005/10/13 06:45
なるせさんの blog で、Citrus iconv のテスト結果が出ていたので、CVS からソースをとってきて、調べてみています。

CP932関連ファイル
src/share/i18n/esdb/CP/CP932.src
src/lib/libc/citrus/modules/citrus_mskanji.c
src/share/i18n/csmapper/CP/mapper.dir.CP.src
src/share/i18n/csmapper/JIS/JISX0208@MS%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0208@MS.src
src/share/i18n/csmapper/CP/CP932EXT%UCS.src
src/share/i18n/csmapper/CP/UCS%CP932EXT.src
src/share/i18n/csmapper/JIS/JISX0208VDC@NEC%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0208VDC@NEC.src

EUC-JP-MS関連ファイル
src/share/i18n/esdb/EUC/EUC-JP-MS.src
src/lib/libc/citrus/modules/citrus_euc.c
src/share/i18n/csmapper/JIS/mapper.dir.JIS.src
src/share/i18n/csmapper/JIS/JISX0208@MS%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0208@MS.src
src/share/i18n/csmapper/JIS/JISX0208VDC@NEC%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0208VDC@NEC.src
src/share/i18n/csmapper/JIS/JISX0208UDC%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0208UDC.src
src/share/i18n/csmapper/JIS/JISX0212@MS%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0212@MS.src
src/share/i18n/csmapper/JIS/JISX0212VDC@IBM%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0212VDC@IBM.src
src/share/i18n/csmapper/JIS/JISX0212UDC%UCS.src
src/share/i18n/csmapper/JIS/UCS%JISX0212UDC.src

とりあえず、調べるべきと思われるファイルを列挙しておきます。

参考資料
Citrus iconv の実装
http://citrus.bsdclub.org/doc/iconv-article-rev2.pdf
記事へブログ気持玉 0 / トラックバック 1 / コメント 3


[MUA] MacOS X 標準のメールソフト

2005/10/13 04:55
MacOS X 標準のメールソフトで、丸付き数字などを本文に入れて送信してみたら…
Mime-Version: 1.0 (Apple Message framework v623)
Content-Transfer-Encoding: base64
Message-Id: <3cd44e3c2d7d79b71d911dbcbdfeead6@mtg.biglobe.ne.jp>
Content-Type: text/plain; charset=CP932; format=flowed
To: =?ISO-2022-JP?B?GyRCPzk7MxsoQiAbJEI+LUc3GyhC?= <msyk@mtg.biglobe.ne.jp>
From: =?ISO-2022-JP?B?GyRCPzk7MxsoQiAbJEI+LUc3GyhC?= <msyk@mtg.biglobe.ne.jp>
Subject: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhC?=
Date: Thu, 13 Oct 2005 04:26:39 +0900
X-Mailer: Apple Mail (2.623)

う〜ん、やるなら charset=Windows-31J でしょう。
Thunderbird では文字化けする。
記事へブログ気持玉 / トラックバック / コメント


[Samba 3.0] charset モジュール

2005/10/13 01:52
現状報告。
Windows標準文字セット+JIS X 0212 と Unicode とのマッピングテーブルを1本化して、CP932、CP51932、EUCJP-MS に対応させてみました。
しかし、同じマッピングテーブルが CP932.so、CP51932.so、EUCJPMS.so に個別に含まれてしまっているので、サイズ的には意味なし。
マッピングテーブルを共有ライブラリ化する必要あり。
Samba の configure を libtool 化する必要もあるかもしれません。
といった所。
記事へブログ気持玉 / トラックバック / コメント


[Sylpheed] NEC選定IBM拡張文字への対応

2005/10/10 16:27
Fedora Core 3 では、Evolution ではなく Sylpheed という国産のメールソフトを使うことにしました。

機種依存文字対応という事で調べてみましたが、Windows と互換性のあるのは NEC特殊文字だけで、NEC選定IBM拡張文字を受け取ると、Unicode の Private Use Area (ユーザー定義文字がマッピングされている領域) に変換するようになっていました。

ISO-2022-JP⇔UTF-8 の変換を EUC-JP-MS 経由で変換しているためで、ここを CP932 経由で変換するようにして、CP932→ISO-2022-JP の変換で、IBM拡張文字をNEC選定IBM拡張文字に置換する事で、Windows 互換にして使ってみています。

Windows 用のメールソフトでも、IBM拡張文字をNEC選定IBM拡張文字に置換せずに ISO-2022-JP に変換してしまい、8ビットコードが出現する酷いコードを送信しているソフトもあるので、そういったソフトからのメールは文字化けしますけれども。

送信時に、機種依存文字 (JIS X 0208 外字) のチェックをして UTF-8 メールで送信するなどの事ができるといいかも。
記事へブログ気持玉 / トラックバック / コメント


[MUA] UTF-8 Ready

2005/10/09 13:36
文字コードの確認をせずに Fedora Core 3 標準のメールソフト Evolution で送信したら UTF-8 で送信されてしまい、某メーリングリストでご迷惑をおかけしてしまいました。

デフォルトのエンコーディングを ISOー2022ーJPに変更しましたが、サブジェクトだけはUTF-8 + BASE64 Q エンコード になってしまう。

ISO-2022-JP(RFC1468)は、いろいろと面倒なところがあるので、UTF-8 に移行するのは賛成ですが、有無を言わさずに UTF-8 になってしまうのは、困りますネ。

もはやインターネットメールは、一部の技術者が使うものから社会のインフラとして活用されてきているので、極力文字化けがおきないような工夫を技術的に施していく必要があるハズです。

たとえば、はじめてメールを送る場合は、相手がどのようなOSを使い、メールソフトを使っているかわからないのですから、日本であれば ISO-2022-JP でメールを送信するようにします。そして、メールを送信する際には、メールのヘッダーに自分が UTFー8 メールを受け取れるかの許可フラグのようなものを付加しておくります。UTF-8 許可フラグがついているメールを受け取った相手だけに、UTF-8 を送信するという事にするという事で、人の手をわずらわせる事なく、自動的に UTFー8 メールへの移行が行なわれるようになる事が期待できます。

あくまでも、これは一例で、穴があるでしょう。しかし、いいかげん、使う側に人間に専門的な知識がなければ正しく使うことが出来ないという現状が放置されている事は、好ましい状態とは言えません。

MTA どうしが ESMTP によって8ビット透過かチェックしているように、MUA どうしが UTF-8 Ready であるかのチェックするようにしてくれませんかね。
記事へブログ気持玉 / トラックバック / コメント


タイトル 日 時
[GNU libc] glibc への ISO-2022-JP-MS, CP51932 追加
glibc-2.3.5 に対して ISO-2022-JP-MS と CP51932 の追加を行なうパッチを次の場所に置いておきます。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2005/10/08 04:16
CP932系エンコーディングのマッピング
CP932系エンコーディングのマッピング CP932, CP51932, CP5022[0-2], eucJP-ms, ISO-2022-JP-MS でのベンダ定義文字、ユーザー定義文字のマッピングを図で現わしてみました。 ...続きを見る

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 1 / コメント 0

2005/10/08 01:22
[Samba 3.0] Solaris 10 へのインストール
Solaris へ Samba 3.0 をインストールするためには、libiconv にパッチをあててインストールが必要になりますが、パッチがあたらないとか、実行時に libiconv.so がみつからないなどのトラブルがあるようです。 あくまでも参考ですが、次のような手順を踏んでインストールにチャレンジしてみてください。 GNU patch のインストール PATH=/usr/sfw/bin:/usr/ccs/bin:$PATH export PATH wget http://ftp... ...続きを見る

面白い ブログ気持玉 1 / トラックバック 0 / コメント 0

2005/10/05 22:26
[Samba 3.0] CP932, eucJP-ms charset モジュールの組込み
FreeBSD や Solaris で Samba 3.0 を使う場合、パッチをあてた libiconv が必要でなおかつ、共有ライブラリの検索パスが適切に設定されている必要があるという所でつまづく人は多いみたい。 ...続きを見る

ブログ気持玉 0 / トラックバック 2 / コメント 4

2005/10/01 14:09
[GNU libc] ISO-2022-JP-MS 難航
glibc にも、ISO-2022-JP-MS と CP51932 の追加実装してみました。 ISO-2022-JP-MS への出力で、余計なエスケープシーケンスが出力されて make tests でエラーになってしまうという問題があり、原因調査をしています。 ...続きを見る

ブログ気持玉 0 / トラックバック 2 / コメント 0

2005/09/25 17:16
[libiconv] ja-1 パッチ公開
libiconv 1.10 ja パッチを出したばかりですが、ja-1 パッチとして次の修正を行なったパッチを公開しました。 http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.10-ja-patch.html ...続きを見る

ブログ気持玉 0 / トラックバック 0 / コメント 84

2005/09/25 16:26
[libiconv] 環境変数 CHARSET_ALIAS
iconv() の変換の際に Shift_JIS で CP932 の変換を行ないたいという要望 があり、別途パッチにより対応していました。 今回、とある理由から用途別にパッチをわけていたのを取り止める事にしましたので、環境変数 CHARSET_ALIAS で設定変更できるようにしてみました。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2005/09/24 01:18
MinGW 用 libiconv
libiconv-1.10-ja-mingwPORT.tar.bz2 を作成中。 パッチを内蔵し libiconv のソースをダウンロードしパッチをあててメイク・インストールするスクリプトです。 Shift_JIS, EUC-JP, ISO-2022-JP の変換をそれぞれ CP932, CP51932, CP50221(ISO-2022-JP-MS) と同じにした方が良い? ...続きを見る

ブログ気持玉 0 / トラックバック 1 / コメント 2

2005/09/23 13:27
libiconv-2.dll
http://qdbm.sourceforge.net/mikio/rbbs.cgi?id=RA11213820773156950390 MinGW などの環境で Windows でも libiconv が使われているみたい。 大抵、自分でコンパイルせずに出来合いのバイナリを使うから、パッチ適用済みの libiconv DLL を探している人は多いみたいですね。 Windows用だと、sjis->cp932, euc-jp->cp51932, iso-2022-jp->cp50221(is... ...続きを見る

ブログ気持玉 0 / トラックバック 0 / コメント 2

2005/09/18 03:00
cp51932 は Mlang.dll によりサポート
次のページに出ています。 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_evtuv/html/etcondeviceprojectglobalization.asp ...続きを見る

ブログ気持玉 / トラックバック / コメント

2005/09/18 02:22
libiconv 1.10 ja パッチ
libiconv 1.10 に対して次のような修正を行うパッチをリリースしました。 ・cp932 の変換をマイクロソフトの変換と一致させる。 ・cp51932 (Windows での EUC-JP) を追加。 ・eucJP-ms を追加 (TOG/JVC CDE/Motif 技術検討 WG が策定) ・iso-2022-jp-ms を追加 (Windows Code Page 50221相当 + ユーザー定義文字) ・JIS X 0201 ラテン文字を US-ASCII と同一の変換と... ...続きを見る

ブログ気持玉 0 / トラックバック 0 / コメント 4

2005/09/17 20:00
Perl Encode::EUCJPMS モジュール
Perl Encode 用の EUCJPMS モジュールが出ていますね。 http://search.cpan.org/~naruse/Encode-EUCJPMS/ ...続きを見る

ブログ気持玉 0 / トラックバック 1 / コメント 5

2005/09/16 23:34
NetBSDのインストールも必要か…
Citrus iconv と CP932 Citrus iconv の CP932, eucJP-ms 対応について調べないとまずいかな。 なるだけ CP932系エンコーディングの互換性を確保したいので。 ...続きを見る

ブログ気持玉 0 / トラックバック 1 / コメント 0

2005/09/12 13:02
libiconv 1.10 cp932 パッチ
libiconv 1.10 の cp932 パッチを公開しました。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2005/09/03 16:35
cp50220 (x-iso2022jp-cp932)
野良犬日記 2.1 > mutt-1.5.6-7m glibc に cp50220 を追加して欲しいという話。 glibc の cp50220 は、作りかけはあるのですが… libiconv 1.9.1 / 1.9.2 用に cp932修正, eucJP-ms, cp50220, cp50221 追加を行なうパッチに関しては、ただ今、作製中です。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2004/07/28 00:05
libiconv 1.9.x cp932 パッチ
長らくお待たせいたしました。 libiconv 1.9.1 および 1.9.2 用の cp932修正 / eucJP-ms 追加を行なうパッチを公開いたしました。 http://www2d.biglobe.ne.jp/~msyk/software/libiconv-patch.html ...続きを見る

ブログ気持玉 0 / トラックバック 0 / コメント 1

2004/07/27 02:15

トップへ | みんなの「文字コード」ブログ

コードページ932 文字コードのテーマ/BIGLOBEウェブリブログ
文字サイズ:       閉じる