コードページ932

アクセスカウンタ

zoom RSS rescue51932.pl

<<   作成日時 : 2009/08/14 00:31   >>

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

成瀬さんのブログ記事 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:~$

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
エアマックス 95
rescue51932.pl コードページ932/ウェブリブログ ...続きを見る
エアマックス 95
2013/07/10 06:53

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
rescue51932.pl コードページ932/BIGLOBEウェブリブログ
文字サイズ:       閉じる