我使用下面的代码(使用所有2种方法)将使用Winword制作的UTF8文件读入Tmemo。该文件包含IPA发音字符。对于这些角色,我只看到正方形。我尝试了不同版本的tmemo.font.charset,但它没有帮助。
我该怎么办?
彼得
// OD is an TOpenDialog
procedure TForm1.Load1Click(Sender: TObject);
{
var fileH: textFile;
newLine: RawByteString;
begin
if od.execute (self.Handle) then begin
assignFile(fileH,od.filename);
reset(fileH);
while not eof(fileH) do begin
readln(fileH,newLine);
Memo1.lines.Add(UTF8toString(newLine));
end;
closeFile(fileH);
end;
end;
}
var
FileStream: tFileStream;
Preamble: TBytes;
memStream: TMemoryStream;
begin
if od.Execute then
begin
FileStream := TFileStream.Create(od.FileName,fmOpenRead or fmShareDenyWrite);
MemStream := TMemoryStream.Create;
Preamble := TEncoding.UTF8.GetPreamble;
memStream.Write(Preamble[0],length(Preamble));
memStream.CopyFrom(FileStream,FileStream.Size);
memStream.Seek(0,soFromBeginning);
memo1.Lines.LoadFromStream(memStream);
showmessage(SysErrorMessage(GetLastError));
FileStream.Free;
memStream.Free;
end;
end;
答案 0 :(得分:2)
首先,你做了太多工作。您的代码可以简化为:
procedure TForm1.Load1Click(Sender: TObject);
begin
if od.Execute then
memo1.Lines.LoadFromFile(od.FileName, TEncoding.UTF8);
end;
其次,正如David所说,您需要使用支持存储在文件中的Unicode字符/字形的字体。仅设置Font.Charset
是不够的,您必须将Font.Name
设置为兼容字体。看看loursonwinny提到的字体。
答案 1 :(得分:1)
对于这些角色,我只看到正方形。
方块表示该字体不包含这些字符的字形。你需要切换到一个字体。假设您的文件已被正确编码,并且您正在读取您想要的代码点。
您可以将TEncoding.UTF8
传递给LoadFromFile
方法,以避免向内容添加BOM。最后,除非Win32文档说它有意义,否则不要调用GetLastError
。在你称之为的地方,没有理由相信这个价值有任何意义。