将问题ANSI转换为UTF8 C#

我在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); } 

你知道为什么会这样吗?

你知道为什么会这样吗?

是的,你来不及了。 从文件中读取字符串时需要指定ANSI。 在内存中,它始终是Unicode(UTF16)。

当您转换为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); } 

这可能是最简单的方法:

 byte[] ansiBytes = File.ReadAllBytes("inputfilename.txt"); var utf8String = Encoding.Default.GetString(ansiBytes); File.WriteAllText("outputfilename.txt", utf8String); 

我建议阅读这篇http://www.joelonsoftware.com/articles/Unicode.html 。
如果要读取ASCII文件,则需要知道文件的代码页。

这可能是因为您的原始string text已包含无效字符。 如果您的输入是字节数组,则编码转换才有意义。 因此,您应该将文件读取为字节数组而不是字符串,或者如Henk所说,指定用于读取文件的编码。

我的想法是,当你在Notepad ++中保存文件时,它会插入Byte-Order-Mark,因此浏览器可以从中推断出它是UTF8。 否则,您可能必须明确告诉浏览器字符编码,如DTD,XML等。