swd2000gt回答ポイント 200ptウォッチ

文字コード周りについての質問です。

PHP3(SJIS)で構築されていたシステムの会員データを
PHP4(EUC)の新システムへ移行することになったのですが、
保存されている会員情報は
 ・一件ずつURLエンコードされている
 ・SJISとEUCのデータが混在している
 ・ハシゴ高、崎の旧字体(山+立+可)等の機種依存文字も混入
 ・記号のエスケープもされていない
という現状で、どこから手をつけるべきかと困惑しています。
URLエンコードからの抽出、SJISとEUCのデータの振り分けまではなんとかなりそうなのですが
崎の旧字体等はPHPで出力させる際、以降の字を巻き添えに文字化けしてしまいます。

なんとか、文字化けや破損の無い状態で出力させる方法・アイデアはありませんか?
例として、正常に出力したいURLエンコード文字列(EUC)を挙げておきます。⇒「%C8%F8%94%B3」

※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
ログインして回答する

考えましたが…

swd2000gt2006-06-06 23:54:48

ありがとうございます。

その手も浮かんだのですが、如何せん会員情報データですので

なるべく別の文字に変える等の処理はせずに解決したかったのです。

ありがとうございます

swd2000gt2006-06-06 23:50:51

どうもです。なんとか目処が立ちそうな気がしてきました。

まずは破損データチェックの実装をがんばってみます。

ちょっと方向性がかわってしまいそうですが…

ししゃ2006-06-06 23:48:16

問題になっている文字を外字とみなして、何か自分で決めたコードに変換しておき、

表示時にそのコードを見つけたら、文字の画像に変換する形はいかがでしょうか…

破損チェック

成瀬2006-06-06 22:28:43

いろいろ方法はあるでしょうが、

先のEUCの文字のパターンを見て、それを正規表現にする。そして、その正規表現がマッチするものだけを拾う、などとすれば壊れていないものだけを拾えますね。

Perlのになりますが、参考までに「文字の正規表現」

http://www.din.or.jp/~ohzaki/perl.htm#Character

なるほど

swd2000gt2006-06-06 21:41:39

参考になります。

URLエンコードする際、既にデータが壊れていたのでしょう。

抽出する際に破損データを区別できる処理を入れられると良いのですが、難しいですよね?

EUC符号化の体系

成瀬2006-06-06 21:13:58

EUCという文字コードでは、以下のような体系になっていまして、

%94%B3 というコードが来ることは、正常なEUCの文字列ならありえません。

機種依存文字でも、この範囲に収まるようになってます。(具体的にはADxx, F9xx~FCxx)

制御コード

0x00~0x1F、0x7F

ASCII文字

0x20~0x7E

漢字

0xA1A1~0xFEFE (第1バイト・第2バイトとも0xA1~0xFE)

半角カタカナ

0x8EA1~0x8EDF

補助漢字

0x8FA1A1~0x8FFEFE (第2バイト・第3バイトとも0xA1~0xFE)

http://euc.jp/i18n/charcode.ja.html

よって、壊れたデータでしょう。

ちなみに、壊れていなければ、%F9%F5 か %8F%F4%BD になったはずです。

ですよね

swd2000gt2006-06-06 20:02:18

丁寧な回答ありがとうございます。

一口にEUCといっても色々あるようで通常の2バイトEUCでは機種依存な拡張文字を扱えないんですよね。

完全にデータを移行するには(今後のためにも)UTF8化は必須だと考えています。

「%C8%F8%94%B3」は「おざき」さんのデータですので「%94%B3」は崎の旧字体と考えられたのですが…

壊れていると考えるべきでしょうか。

難しいかと

成瀬2006-06-06 19:51:03

結論からいえば、難しいとおもいます。

そもそも前提として、PHPで変換可能な、機種依存文字を含むEUC (eucJP-win) と、IEの機種依存文字を含むEUC (CP51932) が異なっています。また、CP51932 は Windowsの機種依存文字を含むShift_JIS (CP932) のすべての文字を含んでいません。

そのため、eucJP-win の文字列は、一部の文字が

Shift_JIS (CP932) で「IBM拡張文字」に含まれる文字は、

IEでは表示できません。

http://www2d.biglobe.ne.jp/~msyk/charcode/cp932/Windows-31J-char...

可能ならば、PHP4(EUC)でなく、UTF-8にするのが正解だとおもいます。不可能ならば「文字化けはしても一応は格納はされているはずなのでそれで大丈夫」ということになります。

ところで、「%94%B3」って壊れてません?

この質問へのコメント

コメントはありません

この質問への反応(ブックマークコメント)

質問の情報

登録日時
2006-06-06 18:58:39
終了日時
2006-06-13 19:00:04
回答条件
1人10回まで 200 ptで終了

この質問のカテゴリ

この質問に含まれるキーワード

EUC191SJIS223機種依存文字30PHP7798旧字体16エンコード551文字コード574文字化け1005URL11376

人気の質問

メニュー

PC版