1

以下のコードを使用して、Winwordで作成されたUTF8ファイルをTmemoに読み込みました(2つの方法すべてを試しました)。このファイルには 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;

次に、David が言ったように、ファイルに保存されている Unicode 文字/グリフをサポートするフォントを使用する必要があります。を設定するだけでは不十分です。 を互換性のあるフォントFont.Charsetに設定する必要があります。Font.Nameloursonwinny が言及したフォントを見てください。

于 2014-09-04T16:24:40.383 に答える
1

これらの文字については、四角しか見えません。

四角は、フォントにそれらの文字のグリフが含まれていないことを示します。対応するフォントに切り替える必要があります。ファイルが適切にエンコードされており、意図したコード ポイントを読み取っていると仮定します。

BOM をコンテンツに追加する必要がないようTEncoding.UTF8に、メソッドに渡すことができます。LoadFromFile最後に、GetLastErrorWin32 のドキュメントに意味があると記載されていない限り、呼び出さないでください。どこでそれを呼んでも、その値に何らかの意味があると信じる理由はありません。

于 2014-09-04T15:30:20.667 に答える