2015-05-20 100 views
1

它是如何的所有設置:檢測字符串數據[]成功後,所有的字符串比較失敗

  • 我收到byte[]包含CSV數據
  • 我不知道編碼(應該是unicode/utf8)
  • 我需要檢測編碼或回退到默認值(文本可能包含元音變音,因此編碼很重要)
  • 我需要讀取標題行並比較它與定義的字符串

經過短暫的搜索我如何得到一個字符串出byte[]我發現How to convert byte[] to string?其中指出使用類似

string result = System.Text.Encoding.UTF8.GetString(byteArray); 

我(知道)使用this helper檢測編碼和事後Encoding.GetString方法讀取字符串,像這樣:

string csvFile = TextFileEncodingDetector.DetectTextByteArrayEncoding(data).GetString(data); 

但是當我現在嘗試從這個result字符串值相比較靜態我的代碼中的字符串全部比較失敗!

// header is the first line from the string that I receive from EncodingHelper.ReadData(data) 
for (int i = 0; i < headers.Count; i++) { 
    switch (headers[i].Trim().ToLower()) { 
     case "number": 
      // do 
      break; 
     default: 
      throw new Exception(); 
    } 
} 
// where (headers[i].Trim().ToLower()) => "number" 

雖然這似乎是兩個字符串我的問題是進行編碼的問題:

我怎樣才能檢測string的編碼從byte[]並將其轉換成默認的編碼,以便我能夠使用該字符串數據?


編輯

提供上面的代碼工作作爲長字符串數據從保存這樣一個文件來:

string tempFile = Path.GetTempFileName(); 
StreamReader reader = new StreamReader(inputStream); 
string line = null; 
TextWriter tw = new StreamWriter(tempFile); 
fileCount++; 

while ((line = reader.ReadLine()) != null) 
{ 
    if (line.Length > 1) 
    { 
     tw.WriteLine(line); 
    } 
} 
tw.Close(); 

事後與

讀出
File.ReadAllText() 

This

A.強制文件是Unicode(ANSI格式殺死所有的變音)

B.要求的書面文件進行訪問

現在我只拿到了inputStream,並試圖什麼我上面張貼。正如我之前提到的那樣,字符串看起來完全相同。但他們不是。

注意:如果我使用ANSI編碼的文件,它使用Encoding.Default所有工作正常。


編輯2

雖然ANSI編碼數據的工作UTF8編碼(notepadd ++只顯示UTF8不是W/O BOM)開始char [0]: 65279

那麼,是我的錯誤,因爲我猜System.Text.Encoding.UTF8.GetString(byteArray)正在正確的方式。

+1

多一點細節...什麼是CSV真正的編碼?嘗試用Notepad ++打開並查看格式:它是UTF8嗎?沒有BOM的UTF8?安思?你的代碼只是試圖在文件開始時查找BOM,但是許多UTF8/Unicode文件沒有BOM ......最後,頭文件[i]包含的是什麼?對於細節,你有點「輕」 – xanatos

+0

調試器爲構成'headers'的實際字符顯示了什麼?'你希望匹配''number「'? – AakashM

+0

@AakashM它顯示「數字」,所以光學相同。 – sra

回答

2

是的,Encoding.GetString不會剝離BOM(請參閱https://stackoverflow.com/a/11701560/613130)。你可以:

string result; 

using (var memoryStream = new MemoryStream(byteArray)) 
{ 
    result = new StreamReader(memoryStream).ReadToEnd(); 
} 

StreamReader將自動檢測編碼(您的編碼探測器的StreamReader.DetectEncoding()複印件)

+0

是的,我想這是最簡單的方法... – sra