2013-10-02 63 views
1

我必須警告您我是初學者。我有一個文本文件,其中一些行包含編碼錯誤。通過「錯誤」,這是我在解析Linux控制檯中的文件時所得到的(問號而不是字符):在文本文件中刪除包含編碼錯誤的行

encoding error 我想刪除顯示這些「問號」的每一行。我試圖grep -v有問題的角色,但它不起作用。該文件本身是UTF8,我猜想一些行來自以另一種格式編碼的文本。我知道我可以找到一種方法來正確地重新轉化它們,但我只想讓它們現在就消失。

對於我該如何做到這一點,您有什麼想法嗎?

PS:有些行包含可以很好顯示的變音符號。 「串」命令似乎刪除了太多「好」的線。

+0

你試過'dos2unix'? http://www.xinotes.org/notes/note/1377/例如 – fedorqui

+0

它說它是一個二進制文件,不會對它起作用。 – bobylapointe

+0

嗯,我想我貼得太快了。 'dos2unix'解決了新的線路問題,但我認爲它不能解決這些編碼問題。讓我們等待有更多知識的人回答:) – fedorqui

回答

2

mojibake上比其他的ANSI字符編碼處理,你必須檢查兩件事情:

  1. 是在X真的編碼的文件? (X在你的情況下是沒有BOM的UTF-8,你可能試圖以utf-8的形式讀取UTF-8 WITH BOM,UTF-16,latin-1等等,這就是問題所在)。嘗試閱讀(不轉換爲)其他編碼,看看它們中的任何一個是否合適。

  2. 您的區域設置或文本編輯器是否設置爲以UTF-8格式讀取文件?如果不是,那可能是問題所在。檢查支持並找出如何更改設置。在Linux中,嘗試使用localesetlocale命令來檢查並正確設置它。

我想你想如何notepad++的Windows(這也運行完全在Linux中使用酒)讓你設置任何編碼,如果你設置的任何其他一個比讀取文件沒有試圖將其轉換(當然該文件編碼在你將只看到那些奇怪的字符),並且還有一個不同的選項,它允許你從一個編碼轉換到另一個。這對我來說非常有用。

如果您是初學者,可能對此感興趣article。它簡要而清楚地解釋了字符編碼的最新特點和優點。

[編輯]如果上述失敗,甚至是Windows 1252和ANSI等編碼,我剛剛得知here如何刪除使用tr UNIX命令非ASCII字符,將其轉換成ASCII(但要注意信息上多餘的字符是失去了在這個輸出並沒有回來,所以保持輸入文件,以防萬一你找到一個更好的修復):

tr -cd '\11\12\40-\176' < $INPUT_FILE > $OUTPUT_FILE 

,或者,如果你想擺脫整條生產線的:

grep -v -P "[^\11\12\40-\176]" $INPUT_FILE > $OUTPUT_FILE 

這個回答here給出了一個很好的猜測,如果沒有任何編碼在你的文件上工作會發生什麼(不幸的是,唯一直接的解決方案似乎是去除那些有問題的字符)。

+0

你好,謝謝你的回答!我試圖改變Kwrite中的編碼來讀取那些神祕的字符。 (UTF16,ISO等)。我做了他們全部。它不會改變任何東西。這就是爲什麼我正在尋找一種方法來刪除sed或grep的這些行。 – bobylapointe

+0

不客氣:-)確定必須有一個適合的編碼。我對kwrite編碼設置的工作原理並不熟悉,但它可能試圖轉換文件而不是使用不同的編碼來讀取它。如果你知道你的文件來自哪個區域/語言,那麼沒有太多的選項可以嘗試。也有一些窗口的字符集可能會給你在linux上的一些麻煩,這就是爲什麼我建議記事本++,如果你沒有訪問Windows機器,可以在葡萄酒中運行。 – NotGaeL

+0

這是完美的elcodedocle。但是有沒有辦法刪除整行,而不是tr的字符?我閱讀手冊頁,但找不到任何東西。也許有一種方法可以在sed中使用相同的表達式? – bobylapointe

1

您可以使用微Perl腳本,如:

perl -pe 's/[^[:ascii:]]+//g;' my_utf8_file.txt 
+0

Hello levif。謝謝你的回答。我剛剛嘗試過,但這似乎刪除了我所有的口音(é,à等)和外來字符(例如:я)。我真的不知道什麼是錯的。該文件本身並不清楚utf8。通過這個我的意思是它「應該」,但uchardet根本無法識別編碼。 – bobylapointe

+0

嗨,你可以給我們一個你的文件的樣本(當然是二進制),也許使用十六進制格式,即使用hexdump或xxd,如果你有這些工具? – levif

+0

我看到了一個類似的問題:字符集之間的最佳方式轉換文本文件。 – levif