我正在尝试做一些我认为应该相当简单的事情,但我已经花了太多时间在上面,我已经尝试了几种不同的方法,我研究过但无济于事。
基本上,我有一个巨大的名单,其中包含来自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();
}
令我惊讶的是,我得到了这样的输出:
预期输出与原始文件内容完全相同。
如果我甚至不能做一个简单的读/写UTF8字符串任务,我怎么能确定我要构建的用于发出HTTP请求的字符串是否正确?
答案 0 :(得分:6)
你的程序没问题(假设输入文件实际上是UTF-8)。如果您调试程序并使用Watch窗口查看字符串(line
变量),您会发现它是正确的。 那是你如何确定你将发送正确的HTTP请求(或者你对字符串做的任何其他事情)。
您所看到的是Windows控制台中的错误。
幸运的是,它只会影响光栅字体。如果您将控制台窗口更改为使用TrueType字体,例如Consolas或Lucida Console,问题就消失了。
您可以使用“默认值”菜单项为以后的所有窗口设置此项:
答案 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))