将ANSI转换为UTF8

时间:2014-12-29 14:48:09

标签: c# encoding windows-phone-8.1

我在C#Windows Phone 8.1中从互联网上下载文件。问题是,下载的内容具有奇怪的特殊字符。当我使用Notepad ++检查我的电脑上的文件时,它告诉我,该文件是用ANSI编码的,我想把它读作UTF8

这是我的代码

byte[] responseBytes = await client.GetByteArrayAsync("http://somesite/myfile.txt");
string content = Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length);

但由于它是用ANSI编码的,所有特殊字符都显示得很奇怪。

经过一些研究,很多人都有这种方法:

Encoding ANSI = Encoding.GetEncoding(1252);
byte[] ansiBytes = ANSI.GetBytes(str);
byte[] utf8Bytes = Encoding.Convert(ANSI, Encoding.UTF8, ansiBytes);
String utf8String = Encoding.UTF8.GetString(utf8Bytes);

但在WP 8.1中,例程Encoding.GetEncoding(1252)无效,Encoding.Default也是如此。 我能做什么,把我的字符串用UTF8?

1 个答案:

答案 0 :(得分:1)

一般情况下(但显然不在Windows Phone上),执行此操作的方法是从一开始就使用正确的编码:

string content = Encoding.Default.GetString(responseBytes, 0, responseBytes.Length);

Encoding.Default定义为:

  

操作系统当前ANSI代码页的编码。

...您当前尝试做的是解释不正确的编码中的字节,然后尝试重新编码它们。这通常不起作用。


但正如您所说, Windows Phone不支持此。所以你要做的是手动创建一个字节到字符translation table for Windows-1252并查找字符。然后,您可以手动循环输入缓冲区,或者,对于额外的点,创建一个派生自System.Text.Encoding并实现所需编码的新类。

事实上,如果我正确记住C#转换,您甚至不需要查找表。以下是一个基本的,但(为了您的目的)足够Encoding实施:

class Windows1252Encoding : System.Text.Encoding {
    public override int GetByteCount(char[] chars, int index, int count) {
        return count;
    }

    public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex) {
        Array.Copy(chars, charIndex, bytes, byteIndex, charCount);
        return charCount;
    }

    public override int GetCharCount(byte[] bytes, int index, int count) {
        return count;
    }

    public override int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex) {
        Array.Copy(bytes, byteIndex, chars, charIndex, byteCount);
        return byteCount;
    }

    public override int GetMaxByteCount(int charCount) {
        return charCount;
    }

    public override int GetMaxCharCount(int byteCount) {
        return byteCount;
    }
}

这似乎有效,但我不能在Windows Phone上测试它,只能在Mono上测试。