2014-09-04 57 views
0

我使用下面的代碼(嘗試了所有2種方法),將使用Winword製作的UTF8文件讀入Tmemo。該文件包含IPA發音字符。對於這些角色,我只看到正方形。我嘗試了tmemo.font.charset的不同版本,但它沒有幫助。在Delphi 2010中無法看到UTF8字符備註

我該怎麼辦?

彼得

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

你確定你使用的字體包含這些字符嗎? – FileVoyager 2014-09-04 15:16:06

+0

on http://ipa.typeit.org/他們推薦以下字體:Segoe UI,Cambria,Calibri,Ari​​al,Times New Roman,Tahoma或Lucida Sans Unicode(不完整) – FileVoyager 2014-09-04 15:18:37

+0

通過「Winword」,我認爲你的意思是「 Word for Windows「(通常被稱爲」Word「),Word不會創建文本文件,除非您使用」另存爲「和更改文件類型專門告訴它,所以很可能您所看到的方塊是非文本字符,你是否像記事本一樣檢查了文件,看它是否可讀? – 2014-09-04 15:26:54

回答

1

對於這些角色,我只看到廣場。

正方形表示字體不包含這些字符的字形。你需要切換到一個字體。假設您的文件已被正確編碼,並且您正在閱讀您打算使用的代碼點。

您可以將TEncoding.UTF8傳遞給LoadFromFile方法以避免必須向內容添加BOM。最後,除非Win32文檔聲明它有意義,否則不要致電GetLastError。在你稱之爲的地方,沒有理由相信價值有任何意義。

2

首先,你正在做的工作太多。您的代碼可以簡化爲這樣:

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

其次,正如大衛說,你需要使用支持Unicode字符/指存儲在文件中的字形字體。僅設置Font.Charset是不夠的,您必須將Font.Name設置爲兼容的字體。看看loursonwinny提到的字體。