2012-10-27 90 views
2

我有在從流中讀出的字符串數據的應用程序流。字符串數據通常是英文的,但有時會遇到類似'Jalapeño'的字符串,而'ñ'字符串則會顯示爲'?'。在我的實現中,我寧願將流內容讀入一個字節數組,但我可以通過將內容讀入一個字符串。任何想法我能做些什麼來使這項工作正確嗎?閱讀可具有非ASCII字符

當前代碼如下:

byte[] data = new byte[len]; // len is known a priori 
byte[] temp = new byte[2]; 
StreamReader sr = new StreamReader(input_stream); 
int position = 0; 
while (!sr.EndOfStream) 
{ 
    int c = sr.Read(); 
    temp = System.BitConverter.GetBytes(c); 
    data[position] = temp[0]; 
    position++; 
} 
input_stream.Close(); 
sr.Close(); 
+0

'INT C'實際上是拿着char或-1 EOF,和非ASCII值,它看起來像你把自己一半的價值*和*從根本上改變編碼... –

回答

1

既然你試圖填補內容到一個字節數組,不與理會讀者 - 這並沒有幫助你。只使用流:

byte[] data = new byte[len]; 
int read, offset = 0; 
while(len > 0 && 
    (read = input_stream.Read(data, offset, len)) > 0) 
{ 
    len -= read; 
    offset += read; 
} 
if(len != 0) throw new EndOfStreamException(); 
+0

謝謝Marc,這非常有幫助。我有一個後續問題再現字符串'Jalapeño'。當我做一個'字符串s = System.Text.Encoding.UTF8.GetString(數據)'或'字符串s = System.Text.Encoding.Unicode.GetString(數據)'都沒有工作。我得到一個StackOverflow異常(如何合適!)。您是否會建議如何在保留原始字符的同時返回字符串? – joelc

+0

@haxor它存儲什麼編碼? –

+0

這是我必須面對的挑戰之一 - 我只能假設ASCII或UTF8。 – joelc

3

您可以通過encoding到StreamReader的作爲:

StreamReader sr = new StreamReader(input_stream, Encoding.UTF8); 

不過,我知道根據該Encoding.UTF8默認情況下使用文檔。

更新

下面寫着 '墨西哥辣椒' 精:

byte[] bytes; 
using (var stream = new FileStream("input.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    var index = 0; 
    var count = (int) stream.Length; 
    bytes = new byte[count]; 
    while (count > 0) 
    { 
     int n = stream.Read(bytes, index, count); 
     if (n == 0) 
      throw new EndOfStreamException(); 

     index += n; 
     count -= n; 
    } 
} 

// test 
string s = Encoding.UTF8.GetString(bytes); 
Console.WriteLine(s); 

至於做這個的:

byte[] bytes; 
using (var stream = new FileStream("input.txt", FileMode.Open, FileAccess.Read, FileShare.Read)) 
{ 
    var reader = new StreamReader(stream); 
    string text = reader.ReadToEnd(); 
    bytes = Encoding.UTF8.GetBytes(text); 
} 

// test 
string s = Encoding.UTF8.GetString(bytes); 
Console.WriteLine(s); 

從我所理解的 'n' 字符表示爲0xc391在文本中當文本以UTF編碼存儲時。當你只讀一個字節時,你會丟失數據。

我建議讀取整個流作爲一個字節數組(第一個例子),並然後執行編碼。或者使用StreamReader爲您完成工作。

+0

謝謝 - 但'ñ'角色仍然顯示爲'?'即使指定Encoding.UTF8。 – joelc

+1

請注意,Console.WriteLine可能會寫入「?」一個有效的UNICODE字符,如中文或日文。 – bloudraak

+0

感謝Werner,上面的第二個例子「as this does」完美無缺! – joelc