Unix文字セット変換

Unix文字セット変換

Unixの文字セットについて混乱しています。 SFTP経由でCSVファイルをダウンロードしました。

$ file -ib myfile
text/plain; charset=us-ascii

この文字セット操作の目的は、ファイルのデータが次のようになることです。

Flyers: Video Center

私が欲しいが:

Flyers: Video Center

私は試した:

iconv -f us-ascii -t utf-8 myfile

次のエラーが発生します。

iconv: illegal input sequence at position 528666

文字セットについて明確にしてください。 SFTP経由でファイルをインポートするときにUTF-8形式でファイルをダウンロードできますか?一般的に、キャラクタセットでゴミが何であるかをどのように決定しますか?

$Locale  
LANG=en_US.UTF-8  
LC_CTYPE="en_US.UTF-8"  
LC_NUMERIC="en_US.UTF-8"  
LC_TIME="en_US.UTF-8"  
LC_COLLATE="en_US.UTF-8"  
LC_MONETARY="en_US.UTF-8"  
LC_MESSAGES="en_US.UTF-8"  
LC_PAPER="en_US.UTF-8"  
LC_NAME="en_US.UTF-8"  
LC_ADDRESS="en_US.UTF-8"  
LC_TELEPHONE="en_US.UTF-8"  
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=  

$  LC_ALL=C sed -n l  
Zimbabwe,175,Unknown Network,-1,Unknown,-1,Unknown,-1,US: Flyers: Video Center:,854088,Standard Display,-998,10/28/2014

$ iconv -f utf-8 -t l1   
iconv: illegal input sequence at position 1228354  

端末を設定すると(翻訳中のcharsetはUTF-8)、きれいなデータが表示されます。
ただし、ETLツールを使用してUTF-8エンコーディングで読み取ると、データはガベージとして読み込まれます。

ファイルのデータをgrepするとき

"Flyers: Video Center" 

データが次のように保存されたという結果は表示されません。

"Flyers: Video Center"

必要なものを見るためにファイルエンコーディングを変更できますか?

ガベージ文字の16進ダンプ:

0000000: 4e42 4353 3a20 4e48 4c2e 636f 6d3a 2055  NBCS: NHL.com: U  
0000010: 533a 2046 6c79 6572 733a c2a0 5669 6465  S: Flyers:..Vide  
0000020: 6fc2 a043 656e 7465 723a 2057 6861 7427  o..Center: What'  
0000030: 7320 486f 740a                           s Hot.  


$dd bs=1 skip=1228300 count=100 < temp1.csv | xxd  
100+0 records in  
100+0 records out  
100 bytes (100 B) copied, 0.000141 seconds, 709 kB/s  
0000000: 3031 342c 320a 556e 6b6e 6f77 6e20 436f  014,2.Unknown Co  
0000010: 756e 7472 792c 2d31 2c48 756c 7520 4c69  untry,-1,Hulu Li  
0000020: 7665 2c33 3738 3834 312c 4e42 433a 2041  ve,378841,NBC: A  
0000030: 6d65 7269 6361 e280 9973 2047 6f74 2054  merica...s Got T  
0000040: 616c 656e 743a 2053 686f 7274 666f 726d  alent: Shortform    
0000050: 2c33 3230 3631 3332 2c55 6e6b 6e6f 776e  ,3206132,Unknown  
0000060: 2053 6974                                 Sit  

いくつかの歪んだテキスト:

Junk Americaâs   

でなければなりません(アポストロフィはこれが「しかし」ではないことに注意してください)

America’s

そして

BMW â Golden  

次のようにする必要があります(ハイフンは長いハイフンであり、これではないことに注意してください)。

BMW – Golden 

答え1

問題#1:「Flyers:Video Center」を検索しています...結果はありません。:

ファイルの16進ダンプで、単語の間に2バイトのC2A0があることを確認してください。せん断:そして動画。 UTF8エンコーディングです。中断されないスペースgrep NBSPは失敗することが知られています。もっと情報が欲しいなら読んでくださいsedを使用して特殊な「M-BM-」文字を削除する方法そしてsedを使用して置き換える... Hex c2a0。短い答えは次のとおりです。

sed -i.bak -e 's/\xc2\xa0/ /' /path/to/file

質問#2「アメリカ」は「アメリカ」(??)として表示されます。:

ここでダンプにはe28099という3バイトが含まれています。右一重引用符(').実際、ここには何の問題もないはずです!上記の質問によって注意が気になることがあります。 (確認できますか?)

grep、およびロケールを尊重する式(UTF8!)を含む他のツールを使用すると、sed次のように動作します。

printf 'America\xe2\x80\x99s\n' | grep --only-matching "[[:punct:]]"
printf 'America\xe2\x80\x99s\n' | sed -e "s/[[:punct:]]/?/"

UTF-8をすべて削除したい場合」特別な「文字を使用するには上記のヒントを使用できます。iconv(しかし、UTF8をサポートしない理由はほとんどありません。)

ASCII以外の文字をすべて削除します。

type a.txt | iconv -f utf8 -t ASCII//TRANSLIT

または、1 つのロケールの文字を保存します。

type a.txt | iconv -f utf8 -t iso8859-15//TRANSLIT | iconv -f iso8859-15 -t utf8

答え2

同じではないXML、その情報に対して別の方法でcsvを取得する必要がある元のコンテンツエンコーディングを説明するエンコーディングタグを含める必要があります。

しかし、タイプバイナリデータには適していますが、テキストデータには適していません。

これは、コマンドの動作方法によるものです。バラより男のテキスト。おおよその:最初の数バイトを見て、ルックアップテーブルで見つかったコンテンツを見つけてコンテンツを推測しようとします。

したがって、通常、コンテンツ制作者にどの文字セットを使用したかを尋ねるのが最善です。

これが不可能な場合 - 何らかの理由でここにあなたの親友はありますか?

関連情報