C#UTF-8字符串不想转换为ASCII(或者可读的东西)

时间:2014-06-02 21:04:50

标签: c# .net encoding utf-8 ascii

我正在尝试转换正在从文件中读取的字符串。我不知道文件是如何制作或创建的(编码方式),但这是交易:我得到这个字符串:

“operaci n”应该是“operación”(西班牙语操作)。

我在尝试阅读文件时尝试更改编码:

using (StreamReader sr = new StreamReader("file.txt", false, Encoding.ASCII));
using (StreamReader sr = new StreamReader("file.txt", false, Encoding.UTF8));
using (StreamReader sr = new StreamReader("file.txt", false, Encoding.UTF7));
using (StreamReader sr = new StreamReader("file.txt", false, Encoding.UTF32));
using (StreamReader sr = new StreamReader("file.txt", false, Encoding.Unicode));

同样保存文件时(而不是StreamWriter)。我还尝试了一些我在这里找到的奇怪的编码和我自己的一些实验:

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.Default, byteArray))
"operaci?n"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.Unicode, byteArray))

"F\0o\0p\0e\0r\0a\0c\0i\0??n\0"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.UTF32, byteArray))
"F\0\0\0o\0\0\0p\0\0\0e\0\0\0r\0\0\0a\0\0\0c\0\0\0i\0\0\0??\0\0n\0\0\0"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.UTF7, byteArray))
"operaci+//0-n"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray))
"operaci?n"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.BigEndianUnicode, byteArray))
"\0F\0o\0p\0e\0r\0a\0c\0i??\0n\0"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(65001), byteArray))
"operaci???n"

new ASCIIEncoding().GetString(Encoding.Convert(Encoding.ASCII, Encoding.GetEncoding(65001), byteArray))
"operaci???n"

Encoding.GetEncoding(65001).GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(65001), byteArray))
"operaci�n"

Encoding.GetEncoding(65001).GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray))
"operaci?n"

我也尝试过不同的功能:

public static string utf2ascii(string text)        
{
    ASCIIEncoding ascii = new ASCIIEncoding();
    byte[] byteArray = Encoding.UTF8.GetBytes(text);
    byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
    return ascii.GetString(asciiArray);
}

public static string utf2ascii(string text)        
{
    System.Text.Encoding utf8 = System.Text.Encoding.UTF8;
    Byte[] encodedBytes = utf8.GetBytes(text);
    Byte[] convertedBytes = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, encodedBytes);
    System.Text.Encoding ascii = System.Text.Encoding.ASCII;
    return ascii.GetString(convertedBytes);*/
}

无济于事。如你所见,没有任何作用。我也查了一下这个应用程序:http://www.codeproject.com/Articles/17201/Detect-Encoding-for-In-and-Outgoing-Text和带有真正字符串的演示程序出现了:

Encoding test

让我猜测读写UTF-8应该有效,但它没有:(。

任何想法都非常受欢迎和赞赏!在此先感谢:)


好的,解决了,谢谢大家!事实证明,该文件是由记事本保存在Windows 1252中(出于某种未知原因),因为使用Sublime Text或Notepad ++保存的文件不会受此问题的影响。尽管如此,感谢所有人的帮助和单挑,因为你们都帮助我清除了我之前编码的许多疑点和陷阱:)

Lookie!

It works

对于那些想要查看所涉及字节的人,这里是特殊字符:

错误代码:[7]: 65533 '�'但在代码页1252中:[7]: 243 'ó'

我很糟糕,这就是它在Visual Studio中的显示方式。真正的字节(取自使用Sublime Text的十六进制编辑器)在这里,以黄色突出显示:

hex bytes

谢谢大家! :d

2 个答案:

答案 0 :(得分:5)

最有可能是Windows ANSI代码页之一。尝试使用Encoding.GetEncoding(1252)解码文本。

using (StreamReader sr = new StreamReader("file.txt", false, 
    Encoding.GetEncoding(1252)));

我建议使用1252,因为这是用于编写西班牙文本的最合理的ANSI代码页。

除此之外,最好的办法是将文件的内容作为字节数组读取。让我们看一下,我们可以推断出编码。

答案 1 :(得分:2)

使用Encoding.Default(将使用本地计算机的所谓ANSI代码页,对于西班牙语版本的Windows可能是Windows-1252)或Encoding.GetEncoding("Windows-1252")(保证是Windows-1252当然)。