我正在将文本文件中的文本加载到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;
编辑由于对问题的评论,特别是对 Delphi 7 的提示,修改了我的答案。
Richedit 是基于richedit.dll 的,它来自MS,并与Windows 一起打包。在 Windows ME 之后,它启用了 UNICODE。因此,它将文件的前 2 个字符解释为 BOF 的字符集。在某些情况下,字符会被错误解释并被视为 ASCII 或 ANSI 文件中的 BOF(出于兼容性原因,它们不会具有 BOF)。这也可以在 write.exe 中看到。
确保在记事本中保存文件时使用正确的编码。如果文件没有编码(查看二进制查看器中的前两个字节),请尝试(如果可能)在前面添加两个空格并查看问题是否仍然存在。
德尔福 2009 和 2010
在升级到 Delphi 2009 及更高版本时,我将留下我的第一个答案以帮助人们:
我实际上会说文本文件没有编码,而是纯 ASCII 或 ANSI,并且您使用的是启用 UNICODE 的 Delphi 2009 或 2010。前两个字符将被视为 BOF(它告诉程序使用哪种 UNICODE 编码)。如果这恰好是正确的 BOF,则可能会应用错误的编码。
TMemoryStream 不允许强制编码。
如果可能,您可以使用 TStrings,它在 LoadFromFile 方法中有一个新的 TEncoding 参数。这就像
RichEdit1.Lines.LoadFromFile('c:\test.txt', TEncoding.ASCII);