2014-09-04 2 views
0

Я прочитал UTF8-файл, сделанный с помощью Winword, в Tmemo, используя приведенный ниже код (пробовал все 2 метода). Файл содержит символы произношения IPA. Для этих персонажей я вижу только квадраты. Я пробовал разные версии tmemo.font.charset, но это не помогло.Невозможно увидеть символы UTF8 в Delphi 2010 Memo

Что я могу сделать?

Питер

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

+0

на http://ipa.typeit.org/ они рекомендуют следующие шрифты: Segoe UI, Cambria, Calibri, Arial, Times New Roman, Tahoma или Lucida Sans Unicode (неполное) – FileVoyager

+0

Под «Winword», я полагаю, вы имеете в виду " Word для Windows "(чаще всего называемое« Word ». Word не создает текстовые файлы, если вы специально не говорите ему об этом, используя« Сохранить как »и изменяя тип файла, поэтому весьма вероятно, что квадраты, которые вы видите это нетекстовые символы. Вы проверили файл в чем-то вроде «Блокнота», чтобы узнать, читается ли там? –

ответ

1

Для этих персонажей, я вижу только квадраты.

Квадраты показывают, что шрифт не содержит глифов для этих символов. Вам нужно переключиться на шрифт, который делает. Предполагая, что ваш файл был правильно закодирован и что вы читаете в кодах, которые вы намереваетесь.

Вы можете передать TEncoding.UTF8 методу LoadFromFile, чтобы избежать добавления спецификации к контенту. Наконец, не вызывайте GetLastError, если документация Win32 не имеет смысла. Там, где вы его называете, нет оснований полагать, что значение имеет какое-либо значение.

2

Во-первых, вы делаете слишком много работы. Ваш код может быть упрощена следующим образом:

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

Во-вторых, как сказал Дэвид, вам нужно использовать шрифт, который поддерживает символы Unicode/глифы, которые хранятся в файле. Недостаточно установить Font.Charset, вы должны установить Font.Name на совместимый шрифт. Посмотрите на шрифты, о которых упоминал Лурсовинни.