我在c#中将文本文件从ANSI转换为UTF8时遇到问题。我尝试在浏览器中显示结果。
所以我有一个带有许多重音字符的文本文件。它用ANSI编码,因此我必须将其转换为utf8,因为在浏览器中而不是出现“?”的重音符号。无论我如何尝试转换为UTF8,它仍然是“?”。但是,如果我将notepad ++中的文本文件转换为utf8,那么重音符号就会显示得很好。
这是我编写的代码编码:
public string Encode(string text)
{
// encode the string as an ASCII byte array
byte[] myASCIIBytes = ASCIIEncoding.ASCII.GetBytes(text);
// convert the ASCII byte array to a UTF-8 byte array
byte[] myUTF8Bytes = ASCIIEncoding.Convert(ASCIIEncoding.ASCII, UTF8Encoding.UTF8, myASCIIBytes);
// reconstitute a string from the UTF-8 byte array
return UTF8Encoding.UTF8.GetString(myUTF8Bytes);
}
你知道为什么会这样吗?
答案 0 :(得分:16)
你知道为什么会这样吗?
是的,你来不及了。从文件中读取字符串时需要指定ANSI。在内存中,它始终是Unicode(UTF16)。
答案 1 :(得分:7)
当您转换为ASCII时,您会立即丢失所有非英文字符(包括带重音的字符),因为ASCII只有127(7位)字符。
你做了奇怪的操纵。 .net中的string
为UTF-16,因此一旦您返回string
,而不是byte[]
,这无关紧要。
我认为你应该这样做:(我猜你用ANSI表示Latin1)
public byte[] Encode(string text)
{
return Encoding.GetEncoding(1252).GetBytes(text);
}
由于问题不是很清楚,有一个合理的说法,你可能真的需要这个:
public string Decode(byte[] data)
{
return Encoding.GetEncoding(1252).GetString(data);
}
答案 2 :(得分:5)
这可能是最简单的方法:
byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt");
var utf8String = Encoding.Default.GetString(ansiBytes);
File.WriteAllText("outputfilename.txt", utf8String);
答案 3 :(得分:1)
我建议您阅读此http://www.joelonsoftware.com/articles/Unicode.html 如果您要读取ASCII文件,则需要知道该文件的代码页。
答案 4 :(得分:0)
我的想法是,当您在Notepad ++中保存文件时,它会插入Byte-Order-Mark,以便浏览器可以从中推断出它是UTF8。否则,您可能必须明确告诉浏览器字符编码,如DTD中的XML等。
答案 5 :(得分:0)
这可能是因为您的原始string text
已包含无效字符。
如果您的输入是字节数组,则编码转换才有意义。
因此,您应该将文件读取为字节数组而不是字符串,或者如Henk所说,指定用于读取文件的编码。
答案 6 :(得分:0)
此外,您可以尝试以下操作。
我通过使用文件中的notepad +更改了类型。
(编码->转换为UTF-8)
它对我有用。