1

我使用下面的代码(尝试了所有 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;
4

2 回答 2

5

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

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

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

于 2014-09-04T16:24:40.383 回答
1

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

方块表示字体不包含这些字符的字形。您需要切换到可以使用的字体。假设您的文件已正确编码并且您正在阅读您打算阅读的代码点。

您可以传递TEncoding.UTF8给该LoadFromFile方法以避免必须向内容添加 BOM。GetLastError最后,除非 Win32 文档说明它有意义,否则不要调用。在你称之为的地方,没有理由相信这个值有任何意义。

于 2014-09-04T15:30:20.667 回答