在C#中处理非英文字符

3

我希望能够正确理解字符集和编码。有没有人能指向一篇关于在C#中处理不同字符集的好文章?

这是我面临的一个问题之一 -

        using (StreamReader reader = new StreamReader("input.txt"))
        using (StreamWriter writer = new StreamWriter("output.txt")
        {
            while (!reader.EndOfStream)
            {
                writer.WriteLine(reader.ReadLine());
            }
        }

这段简单的代码片段并不能始终保留编码,

例如 -

输入中的Aukéna会转换成输出中的Auk�na。

4个回答

5

之前我尝试在创建写入器时使用reader.CurrentEncoding,但是那样并没有起作用。现在我将输入文件保存为UTF8,并且对于读取器和写入器都使用了Encoding.UTF8,这似乎没有出现任何问题。谢谢! - Colonel Panic

2
我想在读取文件时,您需要知道文件使用的编码方式。否则,您可能会出现无法正确读取文件的情况。
当您知道文件的编码方式时,您可以执行以下操作:
        using (StreamReader reader = new StreamReader("input.txt", Encoding.GetEncoding(1251)))
        using (StreamWriter writer = new StreamWriter("output.txt", false, Encoding.GetEncoding(1251)))
        {
            while (!reader.EndOfStream)
            {
                writer.WriteLine(reader.ReadLine());
            }
        }

另一个问题出现了,如果你想更改文件的原始编码。以下文章可能会为您提供有关编码的良好基础:Unicode和字符集的绝对最低要求(无借口!)。这是一个msdn文章链接,您可以从中开始:编码类。请注意保留HTML标签。

2

StreamReader.ReadLine() 试图使用UTF编码读取文件。如果您的文件不是该格式,则StreamReader将无法正确读取字符。

这篇文章详细介绍了问题,并建议通过向构造函数传递此编码System.Text.Encoding.Default来解决问题。


0
你可以创建自己的解析器。我使用的是:
`var ANSI = (Encoding) Encoding.GetEncoding(1252).Clone();`
ANSI.EncoderFallback = new EncoderReplacementFallback(string.Empty);`

第一行创建了Win-1252编码的克隆(因为我处理的数据库使用Win-1252,你可能想使用UTF-8或ASCII)。第二行-在解析字符时-如果没有原始字符的等效项,则返回空字符串。

之后,最好过滤掉所有命令字符(根据需要排除制表符、空格、换行符和回车符)。

以下是我个人设置的编码解析器,用于纠正输入到我们数据库中的数据。

private string RetainOnlyPrintableCharacters(char c)
{
//even if the character comes from a different codepage altogether, 
//if the character exists in 1252 it will be returned in 1252 format.
    var ansiBytes = _ansiEncoding.GetBytes(new char[] {c});

    if (ansiBytes.Any())
    {
        if (ansiBytes.First().In(_printableCharacters))
        {
            return _ansiEncoding.GetString(ansiBytes);
        }
    }
    return string.Empty;
}

_ansiEncoding来自于var ANSI = (Encoding) Encoding.GetEncoding(1252).Clone();,并设置了回退值。

如果ansiBytes不为空,则表示该特定字符的编码可用,因此将其与所有可打印字符的列表进行比较,如果存在,则是可接受的字符,因此将其返回。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接