在Delphi 2010备注中看不到UTF8字符



我使用下面的代码(尝试了所有2种方法)将用Winword制作的UTF8文件读取到Tmemo中。该文件包含IPA发音字符。对于这些字符,我只看到正方形。我尝试了不同版本的tmemo.font.charset,但没有帮助。

我能做什么?

Peter

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

首先,你做的工作太多了。您的代码可以简化为:

procedure TForm1.Load1Click(Sender: TObject);
begin
  if od.Execute then
    memo1.Lines.LoadFromFile(od.FileName, TEncoding.UTF8);
end;

其次,正如David所说,您需要使用一种支持存储在文件中的Unicode字符/字形的字体。仅仅设置Font.Charset是不够的,必须将Font.Name设置为兼容的字体。看看卢森维尼提到的字体。

对于这些字符,我只看到正方形。

方形表示字体不包含这些字符的字形。你需要切换到一种可以的字体。假设你的文件已经正确编码,并且你正在读取你想要的代码点

可以将TEncoding.UTF8传递给LoadFromFile方法,以避免在内容中添加BOM表。最后,不要调用GetLastError,除非Win32文档说它有意义。无论你怎么称呼它,都没有理由相信这个价值有任何意义。

相关内容

  • 没有找到相关文章

最新更新