- PR -

複数の文字コードが混在したテキストファイルの操作

投稿者投稿内容
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-08-26 11:00
半角英数だけだったらASCIIとして読んで平気だろうし、そうでなければおそらく3バイト文字が
含まれてるでしょうね(日本語文字は3バイトだから)。

バイト列だけからUTF-8かShift_JISかを判断するのは不可能な気がします。
例えばUTF-8で「省省」(0xE79C81 0xE79C81)と書いても、Shift_JISとして読めば「逵∫怐」(0xE79C 0x81E7 0x9C81)となります。

シフトJIS文字の直後にUTF-8(またはその逆)というパターンはなさそうですから
ダブルクオートの位置さえ把握できればなんとかなりそうな気もしますが、私も「結構面倒そう」という意見です。
syousuke
会議室デビュー日: 2002/09/27
投稿数: 19
投稿日時: 2007-08-27 01:58
この場合のレコードフォーマットでは項目の位置によって文字コードが
決まっているので、そこまで複雑ではないのではないでしょうか。

1.まず、最初にバイナリで改行まで読み込んでおき、
2.項目(3)までは普通にASCII(UTF8でもOK?)で文字列化する。かつバイト位置を覚えておく。
3.覚えておいたバイト位置(つまり項目(4)の開始位置)から行末まで一旦
 UTF8で文字列化して"文字(項目(4)の終了位置)をみつける。
 また、項目(4)のバイト数を求める
4.項目(3)までのバイト位置に項目(4)のバイト数を加えた位置から行末までを
 もう一度、SJISにて文字列化する。

という感じじゃないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-27 07:26
まず、パッケージソフトの説明書をあたる。複数のコードをファイル内で混在した場合、読めるソフトは存在しないので、専用のビューアーなどが付いていないか、単一コードで出力するオプションなどないか、調べる。
次にメーカーへ問い合わせる。

プログラム作るのはその次。
(ここまで来ちゃったのかも知れないけど、初めからここなら、やり直す方がいいと思う)
Cozy
会議室デビュー日: 2007/08/24
投稿数: 3
投稿日時: 2007-08-28 00:10
べるさん、よねKENさん、syousukeさん、Jittaさん アドバイスありがとうございます。
まとめてリプライさせていただきますがご容赦下さい。


まずバイナリデータを扱うにあたり、1バイト単位でチェックが必要な点は了解しました。
今回、改行コードはCRLFになるので、0D 0Aを行区切りとして扱うということですね。
# テキストデータなら、Split関数で一気に配列展開したいところですが、、。


日本語の処理についてですが、今回のログには UTF8 と Shift_JIS が混在するフィールドは存在しない(UTF8のフィールドとShift_JISのフィールドが存在する)ので、区切り文字に着目した分割を行えば、比較的少ないコードで実装出来そうです。

# UTF8/Shift_JISの2バイト目以降に空白、"、'のキャラクタコードが含まれていない
# ようなので、、、。



ちなみに今回のパッケージは日本法人を持つ海外パッケージですが、説明書の随所に「ソース読め」的な記述が多いんです。勿論ベンダーにも問合せしてますが、文字コードが混在している部分がUTF8とShift_JISという正式回答があったのみで、それ以上の話になると、いわゆる「ログ管理をしたい、そんな貴方にこのソリューション」が出てきます(それなら最初から提案してくれっつーの)。

スキルアップ/キャリアアップ(JOB@IT)