[pgsql-jp: 26503] Re: [pgsql-jp: 26464] Invalid EUC_JP character エラー対策

Hajime Lucky Okada paraiso @ luckyo.8m.com
2002年 6月 27日 (木) 14:29:09 JST


こんにちは、岡田です。

皆様の情報を元に表題の件について色々調査した結果、何とか
下記のロジックで行いたいことを実現出来ましたので、参考までに
ご一報致します。

1. 文字列全体が EUC コードに合致しているか検査。 OK なら次の文字列。
2. NG なら途中に文字化けを含んでることを意味する。
   この時、文字列の頭から文字化けの手前までを救出して、
   文字化け部より後ろを破棄する。

これにより、文字化けを含んでるから全てを削除するのではなく
生きてるところは何とか残せることになるので、今回はこの論理を使いました。
今から思うと確かに大した事ではなかったのですが、、、 (^^;;

ありがとうございました。
何かありましたら、またご連絡下さい!
宜しくお願い致します。

岡田はじめ


--------------------------------------
(参考)最後にコードを。  Perl です。
『複数項目のCSVデータに対して、EUC の検査を行い、文字化けがあれば
  それ以降をカットし健全にします。』


# 「Perlメモ」 参照	http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP
$ascii      = '[\x00-\x7F]';
$twoBytes   = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

$_ = '(tab 区切りCSV文字列)';

@item = split /\t/;		# トークン分解
foreach (@item) {
	# 完全な EUC 文字列であれば、OK. 次のトークンへ。   パターンの最後に $。
	next  if( /^($ascii|$twoBytes|$threeBytes)+$/ );
	
	# 完全なEUC 文字列で無かったら・・
	#	生きてる文字列があれば、出来るだけ生かす。頭から化けてたら null 化。
	# print "化けもの発見 [$_] --> ";

	if( /^($ascii|$twoBytes|$threeBytes)+/ ) { $_ = $&; }   # マッチ部 後方参照
	else                                     { $_ = ""; }

	# print "[$_]\n";
}






pgsql-jp メーリングリストの案内