我在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?
答案 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上测试。