Delphi 加载文本时的中文符号

Delphi 加载文本时的中文符号,delphi,delphi-7,richedit,Delphi,Delphi 7,Richedit,我正在将文本从文本文件加载到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; 编辑根据对问题的评论,特别是对Delph

我正在将文本从文本文件加载到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中看到

在记事本中保存文件时,请确保使用正确的编码。如果文件没有编码(查看二进制查看器中的前两个字节),请尝试(如果可能的话)在前面添加两个空格,看看问题是否仍然存在

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);

也可以查看此页面:

哪个版本的Delphi?文本文件的编码是什么?它是通过Windows新创建的txt文件。Delphi 7如果您使用记事本,请确保它将其保存为ASCII编码,而不是UTF8。如果没有标记,则不仅仅是前两个字符。因此,把“布什把文件藏起来”保存在记事本里的流行噱头,当你把它读回来的时候,你会听到乱七八糟的中文。(单词实际上并不重要,关键是单词的长度。)另请参见“新旧事物”:“记事本文件编码问题,redux”-基本上这是一个无法修复的问题。