我在C#中将文本文件从ANSI转换为UTF8有问题。我尝试将结果显示在浏览器中。

因此,我有一个带有许多重音字符的文本文件。它在ANSI中编码,因此我必须将其转换为UTF8,因为在浏览器中而不是出现“?”的Accentchars。无论我如何尝试转换为UTF8,它仍然是“?”。但是,如果我将记事本++中的文本文件转换为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位)字符。

你做奇怪的操纵。 string 在.NET中,在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所说,指定了用于读取文件的编码。

我在这里的想法是,当您将文件保存在记事本++中时,它插入了 字节订单 因此,浏览器可以从此推断出是UTF8。否则,您可能不得不明确地告诉浏览器XML中的字符编码,如DTD。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top