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