2009-11-26 55 views
1

我想使用System.IO.File.ReadAllLines將文本文件讀入一個字符串數組。但是,ReadAllLines刪除了我想保留的文件中的一些奇數字符,例如chr(187)。我試過了一些不同的編碼選項,但是這並沒有幫助,我沒有看到「不編碼」的選項。如何讀取文本文件而不會丟失奇怪的字符?

我可以使用FileOpen和LineInput無需修改即可讀取文件,但速度相當慢。使用FileSystemObject也可以正常工作,但我寧願不使用它。

什麼是最好的方式來閱讀一個文本文件到一個字符串數組而不用修改.net?

+0

你可以發佈你現在怎麼做的代碼? – 2009-11-26 17:31:17

+0

請記住,「string」是「一系列字符」的數據類型。如果你想保留你的文件當前的確切方式,你應該使用一個字節數組。否則,你必須知道編碼,才能給字節賦予一個可以用字符串表示的含義。 – Joey 2009-11-26 17:33:04

+0

由於不同的編碼,請具體說明CHR(187)的字符是什麼,您期待看到。例如,「正確指向雙角引號」。那是你正在尋找的那個? – 2009-11-26 17:42:10

回答

6

沒有「無編碼」這樣的概念。你必須找出正確的編碼,否則你不可能正確解釋數據。

當你說「chr(187)」你是什麼Unicode字符?

一些編碼,你可能會想嘗試:

  • Encoding.Default - 系統默認編碼
  • Encoding.GetEncoding(28591) - ISO-Latin-1的
  • Encoding.UTF8 - 很常見在現代文件中
+0

當我說chr(187)時,我的意思是該文件中該字節的值是187.我意識到它必須在Windows中轉換爲某個字符,並且我不關心那個字符是什麼。但我希望能夠將我字符串中的字符看作等於chr(187)的字符。現在,當我使用ReadAllLines和以上三種編碼選項時,該字符缺失。 – xpda 2009-11-26 17:43:45

+0

我猜你想要的代碼頁是1252西歐('Encoding.GetEncoding(1252)')。你確定你完全錯過了角色嗎? 'ReadAllBytes(...,Encoding.GetEncoding(28591))''Encoding.Default'的大多數locales的值都會將每個字節轉換爲* some *字符或其他值(儘管在28591的情況下它將是一個控件字符),所以如果他們沒有通過你在其他地方有問題。 – bobince 2009-11-26 17:57:06

+0

GetEncoding(1252)不會這樣做。是的,這些字符被剝離出文件。如果我在WriteAllLines之後立即執行ReadAllLines,則輸出文件將小於輸入文件。 – xpda 2009-11-26 18:00:52

2

這聽起來像你想讀取原始字節。

使用File.ReadAllBytes將它們讀入數組(不要對大文件執行此操作),或者使用FileStream一次讀取字節塊。

+0

我不想使用原始字節,因爲我正在處理字符串數據。爲此使用字節太慢且麻煩。我希望能夠閱讀一個文本文件,並確信我得到的整個文件沒有缺失字符。 – xpda 2009-11-26 17:50:09

0

被除去的字符位於文件的開頭。事實證明,它們是UTF-8的字節順序標記。 File.ReadAllLines和File.ReadAllText會去掉字節順序標記,而LineInput和FileSystemObject函數則不會。

如果我在問題中解釋過奇怪的字符是在文件開頭,我想我會得到一個快速的答案。我會給喬恩Skeet信貸爲我提出的問題的最佳答案。

相關問題