将UTF-8字节解码为Latin-1字符

时间:2017-01-31 09:44:47

标签: c# encoding utf-8 decoding

我有一个字符串,我从第三方应用程序收到,我想在我的Windows Surface上使用C#以任何语言正确显示它。

由于编码不正确,我的字符串在波斯语(波斯语 - 阿拉伯语)中看起来像这样:

  

...ÙOU“-O±Ù†ù-U ...ÙÛŒ-جدید-5-436x500

虽然看起来像这样:

  

مدل-رنگ-موی-جدید-5-436 X500

此链接正确转换:

http://www.ltg.ed.ac.uk/~richard/utf-8.html

我如何在c#中完成?

1 个答案:

答案 0 :(得分:1)

很难确切地说出问题描述的确切内容。如果您向我们提供了使用单个字符而不是整个字符串发生的事情的示例,并且如果您选择了不属于某些特殊字符集的示例字符,例如子弹字符,那么我们会好得多。 (u2022)或类似的东西。

无论如何,可能发生的事情是:

字母“ر”以UTF-8表示为D8 B1的字节序列,但您看到的是“ر”,这是因为在UTF-16中,Ø是u00D8,±是u00B1。因此,传入的文本最初是UTF-8,但是在将其导入到应用程序中的dotNet Unicode String的过程中,它被错误地解释为在某些8位字符集中,例如ANSI或Latin- 1。这就是为什么你现在有一个Unicode String似乎包含垃圾。

然而,将8位字符转换为Unicode的过程在很大程度上并不具有破坏性,因此所有信息仍然存在,这就是为什么你链接到的UTF-8工具仍然可以理解为什么它的。

您需要做的是将字符串转换回ANSI(或Latin-1,无论如何)字节的数组,然后以正确的方式重新构造字符串,这是UTF-8到Unicode的转换。

我不能轻易地重现你的情况,所以这里有一些事情要尝试:

byte[] bytes = System.Text.Encoding.Ansi.GetBytes( garbledUnicodeString );

接着是

string properUnicodeString = System.Text.Encoding.UTF8.GetString( bytes );