C# C语言中非英语字符的处理#

C# C语言中非英语字符的处理#,c#,character-encoding,streamreader,streamwriter,C#,Character Encoding,Streamreader,Streamwriter,我需要正确理解字符集和编码。有人能告诉我如何在C#中处理不同的字符集吗 这是我面临的一个问题- using (StreamReader reader = new StreamReader("input.txt")) using (StreamWriter writer = new StreamWriter("output.txt") { while (!reader.EndOfStream) {

我需要正确理解字符集和编码。有人能告诉我如何在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

您只是有一个编码问题。你必须记住,你真正阅读的是一个比特流。您必须告诉您的程序如何正确解释这些位

要解决您的问题,只需使用接受编码的构造函数,并将其设置为文本使用的任何编码


我想在读取文件时,您应该知道文件的编码方式。否则,您很容易无法正确阅读

知道文件编码后,可以执行以下操作:

        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());
            }
        }
如果要更改文件的原始编码,则会出现另一个问题

以下文章可能会为您提供编码的良好基础:

这是一篇链接msdn文章,您可以从中开始:

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


详细说明问题并建议将此编码传递给构造函数
System.Text.encoding.Default

您可以始终创建自己的解析器。我使用的是:

`var ANSI=(Encoding)Encoding.GetEncoding(1252.Clone()

第一行创建了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;
}
_AnsienceODing来自变量ANSI=(Encoding)Encoding.GetEncoding(1252.Clone();设置了回退值


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

之前,我在创建writer时曾尝试使用reader.CurrentEncoding,但不起作用。现在,我将输入文件保存在UTF8中,并对读卡器和写入器使用Encoding.UTF8,这似乎可以正常工作。谢谢
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;
}