Re: 制御文字と文字化け (HIGUCHI Koichi) KH Coder 旧掲示板
[ツリー表示] [留意事項] [ワード検索] [過去ログ]

  [No.143] 制御文字と文字化け 投稿者:HIGUCHI Koichi  《URL》   投稿日:2006/03/14(Tue) 00:38:10

こんにちは、樋口です。

今回はKH Coderの動作確認のために、大切なデータを拝見させていただき
まして、大変ありがとうございました。おそらく、問題は解決したと思い
ますので、お送りいただいたデータは削除させていただきました。
(もし解決していなかった場合には再度ご連絡下さいませ)

データファイル中に制御文字や文字化け箇所があると、トラブルが生じる
場合があるわけですが、以下に、自分の備忘用途もかねて、今回使用した
Perlスクリプトを貼っておきます。改行文字を除く制御文字を半角スペー
スに置換し、文字化けを含む行を削除するというものです。文字化け箇所
を完全に取り除くことはできていないと思いますが、文字コード判別に影
響を及ぼすような"致命的"な部分は削除できると思います。
(利用にはPerlが必要になります)

------------------------------------------------------------------
# ユーザー設定
my $file_in  = "hoge.txt";              # 入力ファイル(S-JIS)
my $file_out = "hoge_ed.txt";           # 出力ファイル

# 設定
use strict;
use Jcode;
my $ascii           = '[\x00-\x7F]';
my $twoBytes        = '[\x8E\xA1-\xFE][\xA1-\xFE]';
my $threeBytes      = '\x8F[\xA1-\xFE][\xA1-\xFE]';
my $ctrl            = '[[:cntrl:]]';                         # 制御文字
my $rep             = ' ';                                   # 制御文字の置換用
my $character_undef = '(?:[\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|'  # 9-15,85-94区
	. '\x8E[\xE0-\xFE]|'                                     # 半角カタカナ
	. '\xA2[\xAF-\xB9\xC2-\xC9\xD1-\xDB\xEB-\xF1\xFA-\xFD]|' # 2区
	. '\xA3[\XA1-\xAF\xBA-\xC0\xDB-\xE0\xFB-\xFE]|'          # 3区
	. '\xA4[\xF4-\xFE]|'                                     # 4区
	. '\xA5[\xF7-\xFE]|'                                     # 5区
	. '\xA6[\xB9-\xC0\xD9-\xFE]|'                            # 6区
	. '\xA7[\xC2-\xD0\xF2-\xFE]|'                            # 7区
	. '\xA8[\xC1-\xFE]|'                                     # 8区
	. '\xCF[\xD4-\xFE]|'                                     # 47区
	. '\xF4[\xA7-\xFE]|'                                     # 84区
	. '\x8F[\xA1-\xFE][\xA1-\xFE])';                         # 3バイト文字

# 処理の開始
open (OUT,">$file_out") or die;
open (IN,$file_in) or die;
binmode (IN);
my $n = 0;                              # 文字化けのあった行を数えるカウンタ
while (<IN>){
	chomp;
	my $t = Jcode->new($_,'sjis')->h2z->euc;
	if (
		$t =~ /^(?:$ascii|$twoBytes|$threeBytes)*?(?:$character_undef)/
	) {                                 # 文字化けがあった場合
		# ファイルには出力せずにカウント
		print "$_\n";
		++$n;
	} else {                            # 文字化けがなかった場合
		# 制御文字を置換して出力
		$t =~ s/\G((?:$ascii|$twoBytes|$threeBytes)*?)(?:$ctrl)/$1$rep/g;
		print OUT Jcode->new($t,'euc')->sjis,"\n";
	}
}
close (IN);
close (OUT);
print "lines deleted: $n\n";


- 関連一覧ツリー (■ をクリックするとツリー全体を一括表示します)