2010-06-02 40 views
2

在我的上游某處,「某些事情」發生,看起來像unicode mangling。一個症狀是小寫字母變音(ü)被轉換爲「Ã」(即字符FC被轉換爲C3 BC)。假設我無法控制這個上游流程,那我該如何進行反向工程?如果可能的話,我可以向後搖動香腸機並獲得原始文本嗎?如何診斷和反轉(而不是阻止)Unicode損壞

(如果它有助於瞭解這種情況下,我收到的文本是在一個MySQL轉儲形式。我認爲somwewhere轉儲/運輸過程中它得到了錯位。)

回答

2

首先,它看起來就像你已經得到UTF-8編碼文本一樣(因爲你發現ü在你期望的編碼中被解釋,可能是Latin-1)。

您可以通過檢查是否使用正確的字節序列(以及當然沒有使用的非法字節序列)來猜測這種編碼。請參閱the Wikipedia article以供參考,並查找有效和無效的字節序列。如果文本以BOM開頭,那麼您可以非常確定編碼,但UTF-8不需要這樣做。

要使文本重新獲得所需的編碼,可以使用幾種工具,其中一個爲GNU recode

+0

謝謝 - 維基百科文章解釋了很多。所以基本上我所擁有的是一個字符串(用Java編寫),它由一些不知何故錯過了從UTF-8解碼的字符組成。所以最終的修復包括替換: x = results.getString(「field」); 與 x = new String(rs.getBytes(「field」),「UTF-8」); 大概我會找到一個更優雅的做法,但這是一大進步,尤其是在我的理解。謝謝。 – 2010-06-03 00:36:32

4

您的文字不是'損壞'。它只是UTF8。 C3 BC是什麼ü假設被編碼爲。只要設置你使用UTF8的任何軟件,所有的痛苦都會消失。如果您不能將軟件設置爲Unicode,請認真考慮切換到較新的軟件。

我知道它起初很可怕,但最終你必須這樣做,無論如何。我最喜歡的音樂排字工具剛剛轉換爲僅支持Unicode的輸入法(他們甚至故意刪除對舊版8位代碼頁的支持以讓人們切換),而且我很不高興,認爲Latin-1對我來說足夠好,而且破解工作得很好的東西是愚蠢的......然後我克服了它,只是將emacs設置爲Unicode緩衝區,現在我再也不用在我的生活中再考慮字符編碼了!