C#UTF8读/输出

时间:2012-03-06 15:13:45

标签: c# .net-3.5 utf-8

我正在尝试做一些我认为应该相当简单的事情,但我已经花了太多时间在上面,我已经尝试了几种不同的方法,我研究过但无济于事。

基本上,我有一个巨大的名单,其中包含来自UTF8字符集的“特殊”字符。

我的最终目标是读取每个名称,然后在URL中使用该名称作为GET变量发出HTTP请求。

我的第一个目标是从文件中读取一个名称,并将其标准化以确认我可以在创建字符串并发出所有HTTP请求之前正确读写UTF8。

我制作的test1.txt文件只包含以下内容:

  

OWNAGE

然后我用这个C#代码读入文件。我将StreamReader编码和Console.OutputEncoding设置为UTF8

static void Main(string[] args)
{
    Console.OutputEncoding = System.Text.Encoding.UTF8;

    using (StreamReader reader = new StreamReader("test1.txt",System.Text.Encoding.UTF8))
    {
        string line;

        while ((line = reader.ReadLine()) != null)
        {
            Console.WriteLine(line);
        }

    }

    Console.ReadLine();
}

令我惊讶的是,我得到了这样的输出:

enter image description here

预期输出与原始文件内容完全相同。

如果我甚至不能做一个简单的读/写UTF8字符串任务,我怎么能确定我要构建的用于发出HTTP请求的字符串是否正确?

3 个答案:

答案 0 :(得分:6)

你的程序没问题(假设输入文件实际上是UTF-8)。如果您调试程序并使用Watch窗口查看字符串(line变量),您会发现它是正确的。 是你如何确定你将发送正确的HTTP请求(或者你对字符串做的任何其他事情)。

您所看到的是Windows控制台中的错误。

幸运的是,它只会影响光栅字体。如果您将控制台窗口更改为使用TrueType字体,例如Consolas或Lucida Console,问题就消失了。

screenshot

您可以使用“默认值”菜单项为以后的所有窗口设置此项:

screenshot

答案 1 :(得分:3)

请参阅Reading unicode from console

如果您使用的是.NET 4,则需要使用

    Console.InputEncoding = Encoding.Unicode;
    Console.OutputEncoding = Encoding.Unicode;

并确保您使用Lucida Console作为控制台字体。

如果你使用的是.NET 3.5,那么你可能会运气不好。

要有效地从文件中读取行,我可能会使用:

foreach(var line in File.ReadAllLines(path, Encoding.UTF8))
{
   // do stuff
}

答案 2 :(得分:1)

为了阅读你提到的所有字符,你必须使用像这样的默认编码

new StreamReader(@"E:\database.txt", System.Text.Encoding.Default))