我无法理解String.Substring方法正在做什么。这是我的代码(它是一个香草VisualStudio C#控制台应用程序,其中添加了一些代码):
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace foo {
class Program
{
static void Main(string[] args)
{
String pathToFile = "the-path-to-the-file";
using (StreamReader streamReader = new StreamReader(pathToFile))
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine("encoding = " + streamReader.CurrentEncoding);
String fileContents = streamReader.ReadToEnd();
Console.WriteLine("encoding = " + streamReader.CurrentEncoding);
String substring = fileContents.Substring(0, 35);
Console.WriteLine("substring length = " + substring.Length);
Console.WriteLine("substring = " + substring);
Console.OutputEncoding = System.Text.Encoding.Default;
Console.WriteLine("encoding = " + streamReader.CurrentEncoding);
}
}
}
}
在pathToFile找到的文件包含:
from殲ç'・ダ€ã,|ルダハ€-ダ©.endxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
以十六进制表示:
00000000h: 66 72 6F 6D E6 AE B2 E7 90 B4 E3 83 BB E3 83 80 ; from殲ç´ãƒ»ãƒ€
00000010h: E3 82 A6 E3 83 AB E3 83 80 E3 83 96 E3 83 A9 2E ; ウルダブラ.
00000020h: 65 6E 64 78 78 78 78 78 78 78 78 78 78 78 78 78 ; endxxxxxxxxxxxxx
00000030h: 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 78 ; xxxxxxxxxxxxxxxx
程序输出:
encoding = System.Text.UTF8Encoding
encoding = System.Text.UTF8Encoding
子串长度= 35
substring =from殲ç'・ダã,ダダッ©。©xndxxxxxxxxxxxxxxxxxx
encoding = System.Text.UTF8Encoding
我希望它输出:
encoding = System.Text.UTF8Encoding
encoding = System.Text.UTF8Encoding
子串长度= 35
substring =from殲ç'・ダ,ダダãƒãƒ©。
encoding = System.Text.UTF8Encoding
所以我的问题是为什么substring.Length
返回35但substring
似乎包含> 35个字符?我错误地使用String.Substring
了吗?或者它与StreamReader
有关?或其他什么?
答案 0 :(得分:0)
StreamReader读取正确,Substring只生成35个字符。
重点是System.Console - 令人毛骨悚然的微软产品 - 无法显示Unicode字符。
您可以通过在GUI应用程序中运行相同的代码来验证这一点。在MessageBox或Label中,您将获得所需的输出。