【问题标题】:Handling non english characters in C#在 C# 中处理非英文字符
【发布时间】:2012-08-19 15:26:13
【问题描述】:

我需要正确理解字符集和编码。有人可以指出我在 C# 中处理不同字符集的好文章吗?

这是我面临的问题之一 -

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

这个简单的代码 sn-p 并不总是保留编码 -

例如——

输入中的 Aukéna 变成输出中的 Auk�na。

【问题讨论】:

    标签: c# character-encoding streamreader streamwriter


    【解决方案1】:

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

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

    http://msdn.microsoft.com/en-us/library/ms143456.aspx

    http://msdn.microsoft.com/en-us/library/3aadshsx.aspx

    【讨论】:

    • 之前我曾尝试在创建编写器时使用 reader.CurrentEncoding,但这不起作用。现在我将输入文件保存在 UTF8 中,并为读取器和写入器使用了 Encoding.UTF8,这似乎可以正常工作。谢谢!
    【解决方案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());
                }
            }
    

    另一个问题来了,如果你想改变一个文件的原始编码。

    以下文章可能会为您提供关于什么是编码的良好基础: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        `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 不为空,则表示传入的特定字符有可用的编码,因此会将其与所有可打印字符的列表进行比较,如果存在 - 它是可接受的字符,因此返回.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-06-02
          • 1970-01-01
          • 2016-12-13
          • 1970-01-01
          • 2016-12-27
          • 2013-07-13
          • 2011-02-25
          • 1970-01-01
          相关资源
          最近更新 更多