web-dev-qa-db-ja.com

混合エンコードされたテキストファイルを再エンコードする方法

いくつかのUTF-8文字(将来のバージョンで修正できる)を除いて、ASCIIのログファイルがあります。

当面は、このファイルをgedit/lessなどで表示/検索/編集可能な状態にする方法を理解する必要があります。

enca -L none file 戻り値 7bit ASCII characters Surrounded by/intermixed with non-text data

enconv -L none -X ASCII fileおよびenconv -L none -X UTF-8 file "成功"しますが、実際には何も変更しません。

このファイルを修正するにはどうすればよいですか?

更新(回答後):

実際、以下のように(すべてに賛成:))ASCII + UTF-8はUTF-8です。私が持っているのは

0003bbc0  28 4c 6f 61 64 65 72 29  20 50 61 74 69 65 6e 74  |(Loader) Patient|
0003bbd0  20 00 5a 00 5a 00 5a 00  38 00 31 00 30 00 34 00  | .Z.Z.Z.8.1.0.4.|
0003bbe0  20 6e 6f 74 20 66 6f 75  6e 64 20 69 6e 20 64 61  | not found in da|
0003bbf0  74 61 62 61 73 65 0d 0a  32 36 20 53 65 70 20 32  |tabase..26 Sep 2|

私はそれが意志であると信じています cp1252タイプのエンコーディング実際には、cp1252が1バイトになるのは何なのかわかりませんASCIIでしょうか?

偶然にも、これのLinux barfsが入力ファイル(IDの取得元)が正しくエンコードされていないことを理解するのに役立ちました...

6
Stephen

あなたが持っているものは実際には CS-2 のビットを含むASCII(通常のエンコーディングでは8ビットバイト))(=基本プレーンに制限されたUnicode(BMP )、各文字は2つの8ビットバイトとしてエンコードされます)、または TF-16 (コードポイントにマルチワードエンコーディングを使用してすべてのUnicodeをエンコードできるUCS-2の拡張) U + D7FF以上)。

私はあなたが箱から出してそのような不気味な混合物を処理することができるツールを見つけるとは思えません。一般的な方法でファイルをデコードする方法はありません。あなたの場合、おそらく起こったことは、いくつかのASCIIデータがある時点でUTF-16にエンコードされたことです(WindowsおよびJavaはUTF-16が好きです;元のデータがすべてASCIIであるという仮定で説明すると、すべてのnullバイトを取り除くことで、使用可能なファイルを回復できます。

<bizarre tr -d '\000' >ascii

「ASCII、いくつかのUTF-8文字を除いて」というファイルは、まさしく、単なるUTF-8ファイルです。

UTF-8ロケールを使用している限り、表示、検索、編集が可能です。

後者にはUTF-8特殊文字の同等の表現がないため、これをasciiに変換することはできません。

あなたはIsolatinに変換したいかもしれません

iconv -f UTF-8 -t ISO-8859-1
4
jlliagre

ASCIIにいくつかのUTF-8文字が含まれているファイルがある場合、それは定義上、UTF-8ファイルです。純粋なASCIIファイルはUTF-8も有効です。

あなたが持っているものは、ASCII、UTF-8、およびLatin-1のような他のいくつかのシングルバイトエンコーディングのようなものです。それは片付けるのが難しいです。しかし、ファイルが実際に何を含んでいるかを知らずに良いアドバイスをすることは困難です。 hexdump -C fileの出力を投稿してみてください(問題のある文字を含む数行に切り詰めます)。

2
cjm

パッケージpython-chardetからchardetを試してください-encaが認識できなかったファイルで試してみました... chardetが文字セットタイプを検出しました。 (マニュアルページによると、encaを意味します非常に単純な文字セット分析:)

タイプを検出できない場合、再エンコードは入力フォーマットを知る必要があるため、再エンコードはかなり無駄になります(を参照してください)文字セットの検出、 未満)

別のテキストエディタでファイルを開こうとすることができます。 emacsvimjeditなど.

geditの[ファイルを開く]ダイアログには、選択/追加/削除オプションがあります。 charset-listにcharsetを選択/追加できます(いったんそれがわかったら)。_geditは、そのリストに表示されているタイプのみを開きます。

さらに、ワープロファイルの可能性があります。OpenOffice.orgで開いてみてください。

別の(desperate(?)オプションは、ユーザーstringsに対するものです。
stringsは、印刷可能な文字列をファイルに出力します。


Detecting character-setsには問題があります。 manyラテン文字ベースの言語(あなたの言語と思われる)には、many文字セットのバリエーション。これらの文字セットの唯一の一般的なテーマは、ベースラインの7ビットASCII文字セットで、16進数の\ x00から\ x7Fまでの128の可能性で構成されています。

8番目のビット(さらに128文字)を利用する多くの1バイト文字セットのいずれでも、この上限を使用します文字セットと同じくらい多くの異なる方法で。

エンコーディングが何であるかを知っていない限り、それを検出するのは統計的確率のゲームです(リバースエンジニアリング)。 letter見ています。バイト値のみが表示されます。一意に定義された差異が検出されない場合(単純なタスクではない)、唯一の手段は、一致する最も頻繁に使用される文字セットを選択することです。

肝心な点は、ファイルに完全に有効な文字セットAが含まれている場合でも、文字セットBと同じように、検出プログラムに対して有効に見える可能性があるということです...これがを知る必要があるです文字エンコーディング! -特に1バイトのみを使用する文字セットの場合。

マルチバイト文字セットには、より明確なフィンガープリントがありますが、それでもサンプルセットが十分に大きくない場合は、推測ゲームです。 ..

1
Peter.O