2013-02-20 72 views
13

我得到了一個MySQL數據庫的出口,似乎有它的編碼隨着時間的推移有點混淆,並且包含HTML char codes的混合,例如& uuml;和代表相同字母的更多問題字符,如üÃ。我的任務是將一些一致性恢復到文件並將所有內容都放入正確的拉丁字符中,例如úó轉換特殊字符,如Ã和Ã回到他們原來的拉丁語alphbet對應的C#

排序我處理字符串的一個例子是

DesinfektionslösungstücherfürFlächen

這應該等同於

50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 
50 Tattoo Desinfektionsl ö sungst ü cher f ü r Fl ä chen 

有沒有一種方法可在C#/。Net 4.5中使用,它可以成功地重新編碼üà t UTF-8

否則採用什麼方法是可取的?

也是上面例子中的段落字符字符串一個實際的段落字符或一些其他字符組合的一部分?

我在創建一個查找表的情況下,需要找到並替換下面,但我不確定它是多麼完整。

É -> É 
“ -> " 
†-> " 
Ç -> Ç 
à -> à 
é, 'é 
à -> À 
ú -> ú 
• -> - 
Ø -> Ø 
õ -> õ 
í -> í 
â -> â 
ã -> ã 
ê -> ê 
á -> á 
é -> é 
ó -> ó 
â€「 -> – 
ç -> ç 
ª -> ª 
º -> º 
à -> à 
+5

ped角:'Ã''和'Ã'完全不是「特殊字符」,但** [Mojibake](https://en.wikipedia.org/wiki/Mojibake)**。 – Boann 2013-02-20 14:11:57

+0

@Boann ped away ...有趣 – 2013-02-20 15:03:52

+0

Btw你的帖子有點誤導,修復數據後,我得到了'DesinfektionslösungstücherfürFlächen',這似乎是正確的,但在你的預期結果,你有空間。 – Esailija 2013-02-20 16:59:00

回答

19

好吧,首先,由於數據已經使用錯誤的編碼進行了解碼,所以有可能某些字符無法恢復。它看起來像是使用8位編碼進行錯誤解碼的UTF-8數據。

沒有內置的方法來恢復這樣的數據,因爲它不是你平時所做的。沒有可靠的方法來解碼數據,因爲它已經被破壞了。

可嘗試的,是剛剛倒過來的數據進行編碼,並再次使用了錯誤的編碼解碼它:

byte[] data = Encoding.Default.GetBytes(input); 
string output = Encoding.UTF8.GetString(data); 

Encoding.Default使用你的系統當前ANSI編碼。你可以在那裏嘗試一些不同的編碼,看看哪一個編碼給出了最好的結果。

+0

謝謝,我認爲你的理論認爲這些數據可能無法恢復,這很可能是正確的。我已經打破了這樣的字符串... 50 Tattoo DesinfektionslösungstücherfürFlächen--- and --- 50 Tattoo DesinfektionslösungstücherfürFlächen。所以我知道什麼應該出現在哪裏,但仍然不能轉換 – 2013-02-20 13:10:59

+0

你的代碼結合@pawlakppp的發現解決了這個問題,所以感謝你們。 – 2013-02-20 14:05:55

3

它可能是windows-1252編碼的字符串,你讀爲UTF-8。

由於Guffa提到的數據已損壞。

讓我們上個字節的樣子:
ö - 在UTF8> C3B6

窗口1252 C3 - >一個 B6 - >¶

所以ö - >ö

什麼對所有這些 「ƒä」:

ƒ - > 83 A - > C2

誠實我不知道他們爲什麼出現,但你可以嘗試抹掉他們,並做一些轉換,如Guffa提到的。祝你好運

+0

謝謝,我自己也在跟蹤調查,並刪除了「ƒ」。數據的再出口已經消除了它們,並把A-hat變成了A-tildes,這很好,然後似乎有一個明確的轉換,如下所示:http://www.i18nqa.com/debug/utf8-debug .html – 2013-02-20 14:02:16

11

由於Windows-1252編碼有5個未分配的插槽,所以數據僅部分不可恢復。 Windows-1252的一些修改會將這些字符填入控制 字符中,但這些字符不會在Stackoverflow中發佈。如果修改了 已經使用了Windows-1252,只要不丟失複製粘貼中的隱藏控制字符,就可以完全恢復。

還有一個不間斷的空格字符,通常會以copypastes的形式被忽略或變成空格,但這並不是直接處理字節時的問題。

的misencoding濫用此字符串所經歷是:

UTF-8 -> Windows-1252 -> UTF-8 -> Windows-1252 

要恢復,這裏有一個例子:

String a = "Desinfektionslösungstücher für Flächen"; 
Encoding utf8 = Encoding.GetEncoding(65001); 
Encoding win1252 = Encoding.GetEncoding(1252); 

string result = utf8.GetString(win1252.GetBytes(utf8.GetString(win1252.GetBytes(a)))); 

Console.WriteLine(result); 
//Desinfektionslösungstücher für Flächen 
+0

謝謝,我會嘗試這種方法。 – 2013-02-21 10:35:08

0

我一直困擾這個char問題。 解決方案:

我的(cs)html文件是UTF-8;我轉換爲UTF-8Y(帶有BOM的UTF-8)。

相關問題