19

我从 MySQL 数据库中得到了一个导出,随着时间的推移,它的编码似乎有些混乱,并且包含HTML char codes诸如& uuml;和更多问题字符的混合,代表相同的字母,例如üÃ。我的任务是使文件恢复一些一致性并将所有内容都转换为正确的拉丁字符,例如úó.

我正在处理的那种字符串的一个例子是

Desinfektionslösungstücher für Flächen

这应该等于

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

C#/.Net 4.5 中是否有一种方法可以成功地重新编码üÃto之类的方法UTF-8

否则什么方法是可取的?

上面示例字符串中的段落字符也是实际的段落字符还是其他字符组合的一部分?

在需要查找和替换的情况下,我创建了一个查找表,如下所示,但是我不确定它的完整性。

É -> É
“ -> "
†-> "
Ç -> Ç
à -> Ã
é, 'é
à -> ú -> ú
• -> -
Ø -> Ø
õ -> õ
í -> í
â -> â
ã -> ã
ê -> ê
á -> á
é -> é
ó -> ó
– -> –
ç -> ç
ª -> ª
º -> º
à  -> à
4

5 回答 5

27

好吧,首先,由于数据已使用错误的编码进行解码,因此某些字符可能无法恢复。看起来它是使用 8 位编码错误解码的 UTF-8 数据。

没有内置的方法可以像这样恢复数据,因为这不是您通常会做的事情。没有可靠的方法来解码数据,因为它已经被破坏了。

您可以尝试对数据进行编码,然后再次使用错误的编码对其进行解码,反之亦然:

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

为您的Encoding.Default系统使用当前的 ANSI 编码。您可以在那里尝试一些不同的编码,看看哪种编码效果最好。

于 2013-02-20T13:01:30.737 回答
15

由于 Windows-1252 编码有 5 个未分配的插槽,因此数据仅部分无法恢复。Windows-1252 的一些修改用控制字符填充这些,但这些不会使其在 Stackoverflow 中的帖子。如果已使用修改过的 Windows-1252,只要不丢失复制粘贴中的隐藏控制字符,您就可以完全恢复。

还有一个不间断的空格字符被忽略或转换为通常使用复制粘贴的空格,但是当您直接处理字节时,这不是问题。

该字符串所经历的错误编码滥用是:

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
于 2013-02-20T16:50:40.923 回答
4

它可能是您读取为 UTF-8 的 windows-1252 编码字符串。

正如 Guffa 所说,数据已损坏。

让我们看一下字节:
ö -> UTF8 中的 C3B6

在 windows-1252 C3 ->Ã B6 ->¶

所以 ö ->ö

所有这些“ƒÂ”怎么样:

ƒ ->83 Â ->C2

老实说,我不知道它们为什么会出现,但是您可以尝试擦除它们并按照 Guffa 提到的那样进行一些转换。祝你好运

于 2013-02-20T13:58:43.473 回答
1

在这里您可以找到更完整的列表:

http://bueltge.de/wp-content/download/wk/utf-8_kodierungen.pdf

于 2014-03-17T08:53:42.843 回答
0

我以前一直被这个字符问题困扰。解决方案:

我的 .(cs)html 文件是 UTF-8;我转换为 UTF-8Y(带有 BOM 的 UTF-8)。

于 2017-12-27T19:51:49.907 回答