2009-09-23 31 views
1

我從文本文件加載文本到richedit,但它顯示奇怪的中文符號,而我做錯了什麼?加載文本時的中文符號

ms := TMemoryStream.Create; 
ms.LoadFromFile('C:\aw.txt'); 
ms.Seek(0, soFromEnd); 
zChar:=#0; 
ms.Write(zChar, 1); 
ms.Seek(0, soFromBeginning); 
RichEdit1.SetSelTextBuf(ms.Memory); 
ms.free; 
+1

德爾福的版本?什麼是文本文件的編碼? –

+0

它是通過Windows新創建的txt文件。 Delphi 7 – Tom

+0

如果您使用記事本,請確保它將其另存爲ASCII編碼,而不是UTF8 –

回答

3

編輯修訂我的回答是由於對問題的意見,特別是提示德爾福7

的Richedit是基於richedit.dll,它來自MS和打包與Windows。在Windows ME之後,它啓用了UNICODE。因此它得到字符集解釋文件的前2個字符爲BOF。有些字符在ASCII或ANSI文件中會被錯誤解釋並被當作BOF使用(由於兼容性原因,它們不會具有BOF)。這也可以在write.exe中看到。

確保在使用記事本保存文件時使用正確的編碼。如果文件沒有編碼(查看二進制查看器中的前兩個字節),請嘗試(如果可能)向前面添加兩個空格並查看問題是否仍然存在。

德爾福2009年和2010年

我會留在我的第一個答案,以幫助人們升級到2009年德爾福和最多的時候:

我實際上說的文本文件沒有編碼,但是純ASCII或ANSI,並且您正在使用啓用了UNICODE的Delphi 2009或2010。前兩個字符將被視爲BOF(它告訴程序使用哪種UNICODE編碼)。如果這恰好是一個正確的BOF,可能會應用錯誤的編碼。

TMemoryStream不允許強制編碼。

如果可能,您可以使用TStrings,它在LoadFromFile方法中有一個新的TEncoding參數。這就像

RichEdit1.Lines.LoadFromFile('c:\test.txt', TEncoding.ASCII); 

看一看這個頁面,以及:http://edn.embarcadero.com/article/38693

+0

如果沒有標記,它不僅僅是前兩個字符。因此,在記事本中儲蓄「布什藏文件」的流行插曲,當你讀回時,你會得到胡言亂語的中國人。 (這些單詞實際上並不重要,它是單詞的長度。) –

+0

另請參閱「舊的新事物」:「記事本文件編碼問題,redux」 - http://blogs.msdn.com/oldnewthing/archive /2007/04/17/2158334.aspx 基本上這是一個你無法修復的問題。 –