2015-09-28 63 views
1

我無法理解什麼String.Substring方法做。這裏是我的代碼(這是由我添加了一些代碼的VisualStudio香草C#控制檯應用程序):C#的StreamReader或字符串讀取字符多於問

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 

程序輸出:

編碼= System.Text.UTF8Encoding

編碼= System.Text.UTF8Encoding

串長度= 35

子=from殲ç'・ #endxxxxxxxxxxxxxxxxxx

encoding = System.Text.UTF8Encoding

儘管我希望它輸出:

編碼= System.Text.UTF8Encoding

編碼= System.Text.UTF8Encoding

串長度= 35

子= from殲ç'・ダ€ã,|ルダラ€ - ラ©.END

編碼= System.Text.UTF8Encoding

所以我的問題是,爲什麼substring.Length回35但substring似乎包含> 35個字符?我錯誤地使用了String.Substring嗎?或者它與StreamReader有關?或者是其他東西?

+0

你確定該文件是ut8編碼嗎? –

+11

請勿使用字符串來操作二進制數據。 –

+1

請花時間格式化您的代碼,但*不*使用'>'引用它所有的... –

回答

0

的StreamReader被正確讀取,子串正好產生35個字符。

的一點是,System.Console - 令人毛骨悚然的微軟產品 - 無法顯示Unicode字符。

您可以通過運行在GUI應用程序相同的代碼驗證這一點。在MessageBox或標籤中,您將獲得所需的輸出。

相關問題