アクセスカウンタ

プロフィール

ブログ名
コードページ932
ブログ紹介
森山 将之です。
http://www2d.biglobe.ne.jp/~msyk/
http://d.hatena.ne.jp/tree3yama/
zoom RSS

Apache の mod_ext_filter で EUC-JP 補助漢字対策

2009/11/26 03:08
EUC-JP で Web サイトを構築した場合、IE が EUC-JP で補助漢字をサポートしていないため、他のブラウザで POST される補助漢字が文字化けしてしまいます。

IE でも数値文字参照なら表示ができるので、補助漢字を数値文字参照に置換して表示しましょうという事で、Apache の mod_ext_filter モジュールから呼び出して使えるフィルタースクリプトを作ってみました。

eucjp_jisx0212_filter.pl
#!/usr/bin/perl

use strict;
use warnings;
use Encode 'decode';

my $euc_jisx0212 = '\x8F[\xA1-\xFE][\xA1-\xFE]';
my $euc_jisx0212_tilde = '\x8F\xA2\xB7';
my $fullwidth_tilde = '~';

while (<STDIN>) {
    s/$euc_jisx0212_tilde/$fullwidth_tilde/go;
    s/($euc_jisx0212)/sprintf("&#%d;", ord(decode('euc-jp', $1)))/geo;
    print;
}

httpd.conf に以下を追加 (http://〜/wiki に対して適用する例)
LoadModule ext_filter_module modules/mod_ext_filter.so

ExtFilterDefine eucjp_jisx0212_output_filter mode=output \
  intype=text/html outtype=text/html \
  cmd="/usr/bin/perl /usr/local/bin/eucjp_jisx0212_filter.pl"

<Location /wiki>
  SetOutputFilter eucjp_jisx0212_output_filter
</Location>

※Fedora 11 で EUC-JP版 pukiwiki をインストールして確認

Input/Output の両方をフィルタリングしたりEUC-JPエンコーディングのバリデーションチェックを行うための Apache モジュールをどうやれば作れるのかという事を調べていたら mod_ext_filter モジュールがある事がわかり、とりあえず Output Filter だけでも外部スクリプトで作ってみようという事で作って見ました。結構簡単に IE の文字化け回避するためのフィルターを作れてしまいました。

Apache側で処理しているので、Webアプリ側には手を加えなくても良いのはうれしい。
記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0


rescue51932.pl

2009/08/14 00:31
成瀬さんのブログ記事 Web上の日本語EUCデータに指定すべきエンコーディングは何か - はてなるせだいあり に関して、コメント欄でコメントしたら、ひどい文字化けを起こしてしまったのでトラックバックにします。

IE の EUC-JP (cp51932) や Firefox の EUC-JP (cp51932 + JIS X 0212) を UTF-8 へ変換する場合、cp51932 から utf-8 へ変換する時に JIS X 0212 が変換できず、eucJP-ms から utf-8 に変換すると cp51932 の NEC選定IBM拡張文字が PUA に変換されてしまうという問題があります。

この問題に関して、私だったら、次の rescue51932.pl というスクリプトを用意して iconv -f eucjp-ms -t utf-8 < euc.txt | perl rescue51932.pl > utf8.txt というような変換を行います。

rescue51932.pl:
#!/usr/bin/perl -w

use 5.8.0;
use strict;
use encoding 'utf-8';

my $src_chars = '\x{E178}-\x{E2DF}\x{E2E2}-\x{E2EF}';
my $dest_chars =
      '\x{7E8A}\x{891C}\x{9348}\x{9288}\x{84DC}\x{4FC9}\x{70BB}\x{6631}'
    . '\x{68C8}\x{92F9}\x{66FB}\x{5F45}\x{4E28}\x{4EE1}\x{4EFC}\x{4F00}'
    . '\x{4F03}\x{4F39}\x{4F56}\x{4F92}\x{4F8A}\x{4F9A}\x{4F94}\x{4FCD}'
    . '\x{5040}\x{5022}\x{4FFF}\x{501E}\x{5046}\x{5070}\x{5042}\x{5094}'
    . '\x{50F4}\x{50D8}\x{514A}\x{5164}\x{519D}\x{51BE}\x{51EC}\x{5215}'
    . '\x{529C}\x{52A6}\x{52C0}\x{52DB}\x{5300}\x{5307}\x{5324}\x{5372}'
    . '\x{5393}\x{53B2}\x{53DD}\x{FA0E}\x{549C}\x{548A}\x{54A9}\x{54FF}'
    . '\x{5586}\x{5759}\x{5765}\x{57AC}\x{57C8}\x{57C7}\x{FA0F}\x{FA10}'
    . '\x{589E}\x{58B2}\x{590B}\x{5953}\x{595B}\x{595D}\x{5963}\x{59A4}'
    . '\x{59BA}\x{5B56}\x{5BC0}\x{752F}\x{5BD8}\x{5BEC}\x{5C1E}\x{5CA6}'
    . '\x{5CBA}\x{5CF5}\x{5D27}\x{5D53}\x{FA11}\x{5D42}\x{5D6D}\x{5DB8}'
    . '\x{5DB9}\x{5DD0}\x{5F21}\x{5F34}\x{5F67}\x{5FB7}\x{5FDE}\x{605D}'
    . '\x{6085}\x{608A}\x{60DE}\x{60D5}\x{6120}\x{60F2}\x{6111}\x{6137}'
    . '\x{6130}\x{6198}\x{6213}\x{62A6}\x{63F5}\x{6460}\x{649D}\x{64CE}'
    . '\x{654E}\x{6600}\x{6615}\x{663B}\x{6609}\x{662E}\x{661E}\x{6624}'
    . '\x{6665}\x{6657}\x{6659}\x{FA12}\x{6673}\x{6699}\x{66A0}\x{66B2}'
    . '\x{66BF}\x{66FA}\x{670E}\x{F929}\x{6766}\x{67BB}\x{6852}\x{67C0}'
    . '\x{6801}\x{6844}\x{68CF}\x{FA13}\x{6968}\x{FA14}\x{6998}\x{69E2}'
    . '\x{6A30}\x{6A6B}\x{6A46}\x{6A73}\x{6A7E}\x{6AE2}\x{6AE4}\x{6BD6}'
    . '\x{6C3F}\x{6C5C}\x{6C86}\x{6C6F}\x{6CDA}\x{6D04}\x{6D87}\x{6D6F}'
    . '\x{6D96}\x{6DAC}\x{6DCF}\x{6DF8}\x{6DF2}\x{6DFC}\x{6E39}\x{6E5C}'
    . '\x{6E27}\x{6E3C}\x{6EBF}\x{6F88}\x{6FB5}\x{6FF5}\x{7005}\x{7007}'
    . '\x{7028}\x{7085}\x{70AB}\x{710F}\x{7104}\x{715C}\x{7146}\x{7147}'
    . '\x{FA15}\x{71C1}\x{71FE}\x{72B1}\x{72BE}\x{7324}\x{FA16}\x{7377}'
    . '\x{73BD}\x{73C9}\x{73D6}\x{73E3}\x{73D2}\x{7407}\x{73F5}\x{7426}'
    . '\x{742A}\x{7429}\x{742E}\x{7462}\x{7489}\x{749F}\x{7501}\x{756F}'
    . '\x{7682}\x{769C}\x{769E}\x{769B}\x{76A6}\x{FA17}\x{7746}\x{52AF}'
    . '\x{7821}\x{784E}\x{7864}\x{787A}\x{7930}\x{FA18}\x{FA19}\x{FA1A}'
    . '\x{7994}\x{FA1B}\x{799B}\x{7AD1}\x{7AE7}\x{FA1C}\x{7AEB}\x{7B9E}'
    . '\x{FA1D}\x{7D48}\x{7D5C}\x{7DB7}\x{7DA0}\x{7DD6}\x{7E52}\x{7F47}'
    . '\x{7FA1}\x{FA1E}\x{8301}\x{8362}\x{837F}\x{83C7}\x{83F6}\x{8448}'
    . '\x{84B4}\x{8553}\x{8559}\x{856B}\x{FA1F}\x{85B0}\x{FA20}\x{FA21}'
    . '\x{8807}\x{88F5}\x{8A12}\x{8A37}\x{8A79}\x{8AA7}\x{8ABE}\x{8ADF}'
    . '\x{FA22}\x{8AF6}\x{8B53}\x{8B7F}\x{8CF0}\x{8CF4}\x{8D12}\x{8D76}'
    . '\x{FA23}\x{8ECF}\x{FA24}\x{FA25}\x{9067}\x{90DE}\x{FA26}\x{9115}'
    . '\x{9127}\x{91DA}\x{91D7}\x{91DE}\x{91ED}\x{91EE}\x{91E4}\x{91E5}'
    . '\x{9206}\x{9210}\x{920A}\x{923A}\x{9240}\x{923C}\x{924E}\x{9259}'
    . '\x{9251}\x{9239}\x{9267}\x{92A7}\x{9277}\x{9278}\x{92E7}\x{92D7}'
    . '\x{92D9}\x{92D0}\x{FA27}\x{92D5}\x{92E0}\x{92D3}\x{9325}\x{9321}'
    . '\x{92FB}\x{FA28}\x{931E}\x{92FF}\x{931D}\x{9302}\x{9370}\x{9357}'
    . '\x{93A4}\x{93C6}\x{93DE}\x{93F8}\x{9431}\x{9445}\x{9448}\x{9592}'
    . '\x{F9DC}\x{FA29}\x{969D}\x{96AF}\x{9733}\x{973B}\x{9743}\x{974D}'
    . '\x{974F}\x{9751}\x{9755}\x{9857}\x{9865}\x{FA2A}\x{FA2B}\x{9927}'
    . '\x{FA2C}\x{999E}\x{9A4E}\x{9AD9}\x{9ADC}\x{9B75}\x{9B72}\x{9B8F}'
    . '\x{9BB1}\x{9BBB}\x{9C00}\x{9D70}\x{9D6B}\x{FA2D}\x{9E19}\x{9ED1}'
    . '\x{2170}\x{2171}\x{2172}\x{2173}\x{2174}\x{2175}\x{2176}\x{2177}'
    . '\x{2178}\x{2179}\x{FFE2}\x{FFE4}\x{FF07}\x{FF02}';

while (<>) {
    eval "tr/$src_chars/$dest_chars/";
    die $@ if $@;
    print;
}


cp51932 の NEC選定IBM拡張文字の変換テスト

masayuki@masayuki-laptop:~$ perl -e 'for $i (0xf9..0xfc) { for $j (0xa1..0xfe) { next if ($i == 0xfc && ($j == 0xef || $j == 0xf0)); print pack("C2", $i, $j); } }' > euc.txt
masayuki@masayuki-laptop:~$ iconv -f eucjp-ms -t utf-8 < euc.txt | perl rescue51932.pl > utf8.txt
masayuki@masayuki-laptop:~$ cat utf8.txt
纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"masayuki@masayuki-laptop:~$


「はてなダイアリー」のように Web ブラウザで POST した日本語EUCデーターをそのまま取り出せないような処理を施している場合は rescue51932.pl では救えないのであしからず。

gnome-terminal の文字コードを EUC-JP に変更して、「はてなダイアリー」の文字化けをシミュレート。

masayuki@masayuki-laptop:~$ perl -e 'for $i (0xf9..0xfc) { for $j (0xa1..0xfe) { next if ($i == 0xfc && ($j == 0xef || $j == 0xf0)); print pack("C2", $i, $j); } }' > euc.txt
masayuki@masayuki-laptop:~$ piconv -f euc-jp -t euc-jp < euc.txt
硃硎??硨确?碰?碭磤磲礀磷礜?礱礴??祅祆???祜???祹???禘禱禸秈秊?秔秞秫秭稃?稹穝穭?窅窠?窳窻竎竫竽?笭?筇筎筠筭筯筲箞?篗篙簁簱?簠簳簶??籙籭籹粏粔粠粼糕糙糝紇紈紓紝紣紱絁絈絓絜絺綃綋?綦緂緌???縨縈縑縕?繇繒繡纊纍罇?羑羗羿翎翛翟翬翮翺?耔耦耵耷耼?胗胠胳脘腊腠腧腨腭膻臊臏臗???艠艴?芎芡芣芤芩芮芷芾芿苆苕苽苾茀茁?茢茭茺荃荇荑荕荽莆莒莘莧莩莿菀菇菏菑?菪萁萆萊?葈?葰葳蒅蒞蒯蒴蒺蓀蓂?蔲蔞蔣蔯蕙蕤?薭蕺薌薏薢?藋藎藭蘒藿蘄蘅蘐?蘘蘩蘸虗??虢?虬虵蚘蚸蛺蛼蛽蜋蝱螇螈螬螭螵?蟖?蠆蠊蠐蠔蠟袘袪裊裎?裵褜?褘褙褚褧褰褲褹襀覔?觔觥觶訒訕訢訷詇詎詝詡詵詹誧?諟諴諶???譆譔譙??豉豨?賡?賸賾?贒贛趯跎跑跗踠踣踽蹰蹻?軀?軺輞輭輶轔?辦辵迤迨迮逈逭?邈邕邗邙邛邢邳邾郄郅郇郗郝?郯郴?鄔?鄖鄢鄯鄱鄴鄽酈酛醃醞醬醱醼釗釻釤masayuki@masayuki-laptop:~$


piconv は Perl Encode モジュールで変換していて、Encode モジュールの euc-jp デコーダーが EUC-JISX0213 を受け付けているため、JIS X 0213 の第3水準の文字を JIS X 0212 に変換した結果として上記のような文字化けが発生します。

上の「はてなダイアリー」での文字化けを IE で表示させた場合の再文字化けをシミュレート

masayuki@masayuki-laptop:~$ perl -e 'for $i (0xf9..0xfc) { for $j (0xa1..0xfe) { next if ($i == 0xfc && ($j == 0xef || $j == 0xf0)); print pack("C2", $i, $j); } }' > euc.txt
masayuki@masayuki-laptop:~$ piconv -f euc-jp -t euc-jp euc.txt | perl -pne 'BEGIN { require "jcode.pl"; } { s/([\x8e\xa1-\xfe][\xa1-\xfe])/jcode::sjis($1, "euc")/ge; }' | piconv -f cp932 -t utf-8
序|序�??序鰹��?序�?序囂亅序イ序エ序カ序セ?序ニ序ヌ??序ヘ序ホ???序ヨ???序ロ???序謠偃序偖序�?序傲徐D徐E徐J?徐\徐g徐m?徐s徐{?徐~徐o刧徐件剔?徐�?徐・徐ヲ徐ィ徐ュ徐ョ徐ッ徐ケ?徐フ徐ヘ徐レ徐�?徐謠呷徐�??徐咼恕H恕M恕N恕P恕W恕a恕c恕e恕k恕l恕q恕s恕u恕y恕~恕¥噪恕�恕緒囈恕�?恕恕ァ恕ャ???恕ニ恕ス恕ソ恕タ?恕マ恕メ恕ユ恕瘴壺恕�?鋤I鋤K鋤T鋤X鋤Z鋤[鋤_鋤`鋤c?鋤o鋤v鋤{鋤|鋤€?鋤囂屆鋤。鋤ェ鋤キ鋤サ鋤ス鋤セ鋤タ鋤メ鋤ヨ鋤リ鋤レ???除F除J?除U除]除^除_除b除d除h除k除l除m除o除z除{除|除}?除縁恚除随恃除柾恙除囂悄除、除ヲ除ゥ除ッ除ー除ウ除エ除オ除キ除ケ?除セ除テ除ト除ナ?除マ?除゚除熄懃除�除懿除戀除�?傷H傷S傷U傷[傷g傷o?傷拍捏傷|傷}傷�?傷衷搏傷寶擧傷沛擅傷「傷・?傷ィ傷ョ傷ー傷コ??傷タ?傷ト傷ニ傷ヘ傷レ傷�傷尞晟傷杁償[償\償j償k償n?償w?償鰹梃償誌梺償�償キ償セ償テ償ヌ?償ム償ン?償レ償ロ償ワ償熄樞償苡樊償髀檳?勝S勝X勝^勝g勝i勝l勝s勝y勝|勝ワ氛勝㍼汪勝�?勝ョ勝ア勝ウ???勝ニ勝ハ勝ヒ??勝謠滬?鐘T?鐘\鐘]?鐘b鐘d鐘w鐘э煥鐘�鐘恟燹鐘ィ鐘コ鐘セ?鐘メ?鐘瘴瑟鐘璧障F?障Q障R障b障c障d障l障u?障�障刻瘤障随瘻障拍癢障搶癲障障。障、障ィ?障ョ障ー?障コ?障サ障テ障ネ障ノ障ハ障ミ障モ障ル障繽硼障磆障叝礒鞘U鞘Imasayuki@masayuki-laptop:~$
記事へブログ気持玉 0 / トラックバック 1 / コメント 0


cp932,cp51932,cp5022x の簡易テスト

2009/07/05 21:20
Sylpheed の初期の機種依存文字対応や Java の x-windows-50220 などの文字コード変換が Windows の Outlook Express や Windows メールの ISO-2022-JP とは異なる変換をしていて、なぜそのような実装にしているのか不思議でならなかったのですが、昨日、WideCharToMultiByte() の変換を調べて、なぞがとけました。

Outlook Express などでは、"g" は、NEC選定I BM拡張文字のコード位置に変換されるのですが、WideCharToMultiByte() でコードページ 50220 へ変換すると、JIS X 0212 補助漢字に変換されるようになっていました。Sylpheed の初期の機種依存文字対応や Java の x-windows-50220 の変換でも JIS X 0212 補助漢字に変換するようになっていたので、WideCharToMultiByte() の変換を調べて実装していたのではないかという事が予想できます。

きちんと Windows の変換を調査したという所までは良かったのですが、実際にそれが Outlook Express や Windows メールでの文字コード変換と同じかどうかまでは調べていなかったのではないかと思われます。

以前に調べたときには、Outlook Express と同じ文字コード変換を行う為には、MLANG.DLL の ConvertINetMultiByteToUnicode(), ConvertINetUnicodeToMultiByte() を使用する必要があるという事がわかっていました。当時、調べたときは、MultiByteToWideChar(), WideCharToMultiByte() のコードページ 50220 の変換は、"〜" の Unicode との対応付けが U+FF5E ではなく U+301C になっていたため、コードページ 50220 の変換に MultiByteToWideChar(), WideCharToMultiByte() は使えないと判断していたわけです。

このように、Windows での文字コード変換の特徴を把握しておいて、それを調べるために、代表的な文字をいくつか変換してみることで、文字コード変換が期待する実装になっているかという事を判定する事ができます。

もし、Windows 固有の文字を扱う必要が出てきたときには、次の文字を使って簡易テストを行うことで、自分が使おうとしている文字コード変換が意図する変換を行っているかどうかを素早く判定できるでしょう。

文字cp932cp51932cp5022xUnicode
0x81600xA1C10x2141U+FF5E
0x81E30xA2E50x2265U+221A
0x87400xADA10x2D21U+2460
0x87540xADB50x2D35U+2160
0xFA670xF9AC0x792CU+5F45
0xFBFC0xFCE20x7C62U+9AD9

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


Windows での cp50220 の変換

2009/07/02 23:24
cp50220, cp50221, cp50222 は MultiByteToMultiByte() / WideCharToMultiByte() で変換すべきではありません。

Outlook Express の ISO-2022-JP (cp50220) は、NEC選定IBM拡張漢字を使用しますが、MultiByteToMultiByte() / WideCharToMultiByte() は、JIS X 0212 補助漢字を使ってしまいます。

Outlook Express と同じ変換を行いたいのなら、MLANG.DLL の ConvertINetMultiByteToUnicode(), ConvertINetUnicodeToMultiByte() などで cp50220 の変換をするようにしましょう。

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


libiconv 1.13 用パッチ

2009/05/02 15:33
libiconv 1.13 のリリースに伴い cp932 関連パッチをアップデートしました。

libiconv 1.13
直接ダウンロード
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.13.tar.gz
GNU Project
http://www.gnu.org/software/libiconv/
SourceForge.net
http://sourceforge.net/projects/libiconv
bug-gnu-libiconv -- Bug reports for GNU libiconv
http://lists.gnu.org/mailman/listinfo/bug-gnu-libiconv

cp932 パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-cp932.patch.gz
説明ページ
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.13-cp932-patch.html

cp932-devel パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-cp932-devel.patch.gz
説明ページ
なし

ja-1 パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.13-ja-1.patch.gz
説明ページ
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.13-ja-patch.html
※ libiconv-1.13-ja-1.patch.gz では、環境変数 CHARSET_ALIAS の追加されません。必要な場合は、ご連絡ください。

参考
文字コード掲示板

記事へブログ気持玉 0 / トラックバック 0 / コメント 3


libiconv-1.12-ja-4.patch.gz

2008/09/20 16:33

opengl2772 さんからのご指摘、ご要望により、libiconv-1.12-ja-1.patch.gz の Shifft_JIS-MS の typo 修正と EUC-JIS-2004, Shift_JIS-2004, ISO-2022-JP-2004 のエイリアス追加を行った ja パッチを作成しました。


ja-4 パッチ

libiconv-1.12-ja-4.patch.gz は libiconv-1.12 に対するパッチです。

libiconv-1.12 は次の場所から取得してください。


libiconv 1.12

参考
記事へブログ気持玉 / トラックバック / コメント


libiconv 1.12 用 cp932 パッチ

2007/11/22 00:56
libiconv 1.12 のリリースに伴い cp932 関連パッチをアップデートしました。

libiconv 1.12
直接ダウンロード
http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.12.tar.gz
GNU Project
http://www.gnu.org/software/libiconv/
SourceForge.net
http://sourceforge.net/projects/libiconv
bug-gnu-libiconv -- Bug reports for GNU libiconv
http://lists.gnu.org/mailman/listinfo/bug-gnu-libiconv

cp932 パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.12-cp932.patch.gz
説明ページ
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.12-cp932-patch.html
FreeBSD ports
http://www.freebsd.org/cgi/cvsweb.cgi/ports/converters/libiconv/

cp932-devel パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.12-cp932-devel.patch.gz
説明ページ
なし
MacPorts
http://svn.macports.org/repository/macports/trunk/dports/textproc/libiconv/
※ libiconv 本家へのマージされやすいようにと考えて必要最低限度のパッチとして作りましたが本家には採用されず MacPorts の方に採用されたようです。

ja-1 パッチ
直接ダウンロード
http://www2d.biglobe.ne.jp/~msyk/software/libiconv/libiconv-1.12-ja-1.patch.gz
説明ページ
http://www2d.biglobe.ne.jp/~msyk/software/libiconv-1.12-ja-patch.html

参考
MLog > [installer 1339] Libiconv-1.12 (with Japanese patch)
Samba - RCC System Wiki (FreeBSD ports での libiconv のインストール等)
Beginning OS X 10.5/備忘録 > cp932fix を有効にするには (MacPorts を使った libiconv のインストール方法)
だめだめ日記 > libiconv が EUCJP-MS のサポートをやめた理由を御存知ないですか?
文字コード掲示板
記事へブログ気持玉 0 / トラックバック 5 / コメント 0


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

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() でなければ、変換できません。

記事へナイス ブログ気持玉 9 / トラックバック 5 / コメント 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 追加

2005/10/08 04:16
glibc-2.3.5 に対して ISO-2022-JP-MS と CP51932 の追加を行なうパッチを次の場所に置いておきます。

http://www2d.biglobe.ne.jp/~msyk/software/glibc/current/

一応、アルファ版ということで、お願いいたします。
要望やバグ報告をいただけると嬉しいです。
記事へブログ気持玉 / トラックバック / コメント


CP932系エンコーディングのマッピング

2005/10/08 01:22
画像
CP932, CP51932, CP5022[0-2], eucJP-ms, ISO-2022-JP-MS でのベンダ定義文字、ユーザー定義文字のマッピングを図で現わしてみました。

細かなところでは、IBM拡張文字→NEC撰定IBM拡張文字の変換で、大文字のローマ数字等は、NEC特殊文字へ変換されるなどが示されていませんが、おおまかなイメージとしては、こんな感じです。

といっても、もうすこし説明が必要かと思いますが、説明はおいおい付け加えていき、とりあえず図だけ公開しておきます。
記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 1 / コメント 0


[Samba 3.0] Solaris 10 へのインストール

2005/10/05 22:26

Solaris へ Samba 3.0 をインストールするためには、libiconv にパッチをあててインストールが必要になりますが、パッチがあたらないとか、実行時に libiconv.so がみつからないなどのトラブルがあるようです。


あくまでも参考ですが、次のような手順を踏んでインストールにチャレンジしてみてください。


GNU patch のインストール


PATH=/usr/sfw/bin:/usr/ccs/bin:$PATH
export PATH
wget http://ftp.gnu.org/pub/gnu/patch/patch-2.5.4.tar.gz
gzip -dc patch-2.5.4.tar.gz | tar xvf -
cd patch-2.5.4
./configure
make
su
make install
exit
cd ..
PATH=/usr/local/bin:$PATH
export PATH

GNU libiconv のインストール


wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.10.tar.gz
wget http://www2d.biglobe.ne.jp/%7Emsyk/software/libiconv/libiconv-1.10-ja-1.patch.gz
gzip -dc libiconv-1.10.tar.gz | tar xvf -
cd libiconv-1.10
gzip -dc ../libiconv-1.10-ja-1.patch.gz | patch -p1
./configure
make
su
make install
exit
cd ..

Samba のインストール


wget ftp://ftp.ring.gr.jp/pub/net/samba/samba-3.0.20a.tar.gz
gzip -dc samba-3.0.20a.tar.gz | tar xvf -
cd samba-3.0.20a/source
LDFLAGS=-Wl,-R/usr/local/lib
export LDFLAGS
./configure --with-libiconv=/usr/local
make
su
make install
exit
cd ../..
記事へ面白い ブログ気持玉 1 / トラックバック 0 / コメント 0


続きを見る

トップへ

月別リンク

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