Конференция "WinAPI" » Прочитать UNICODE файл с китайским текстом [Win2k, WinXP]
 
  • Dmitry (22.04.08 21:23) [0]
    Люди подскажите плиз как можно прочитать и вывести (хотябы отрисовать в Canvas) юникодный файл с китайским текстом.
    Есть текст (txt), есть к нему шрифт. В word открывается все нормально, но как вывести в на форму в дельфи - не врубаюсь.

    Желательно без сторонних библиотек.

    Спасибо
  • Игорь Шевченко © (22.04.08 21:33) [1]
    Без сторонних - на "чистом" API.
    Со сторонними - искать TNT Controls и не мучиться
  • Dmitry (23.04.08 08:52) [2]
    >> Без сторонних - на "чистом" API.
    Дык о б этом и речь - какой минимальны набор необходимых функций ?
    Желательно пример, если возможно.
    Необходимо прочиать строку текста с китайскими символами и вывести на форму....
  • Плохиш © (23.04.08 11:11) [3]

    > Dmitry   (23.04.08 08:52) [2]
    > >> Без сторонних - на "чистом" API.
    > Дык о б этом и речь - какой минимальны набор необходимых
    > функций ?

    Все те же функции, что и для неюникодового текста, только с W в конце названия.
  • Anatoly Podgoretsky © (23.04.08 11:20) [4]
    Никакой разницы, что байты, что символы, что Юникод в части чтения нет.
    Откуда в Виндоус высокоуровневые средства чтения строк.
  • Anatoly Podgoretsky © (23.04.08 11:52) [5]
    > Плохиш  (23.04.2008 11:11:03)  [3]

    Эти функции не отличаются по части чтения, вот имена файлов и папок другое дело.
  • Дмитрий С (23.04.08 12:22) [6]
    DrawTextW какойнить :)
  • Дмитрий С (23.04.08 12:22) [7]
    А дай файлик.
  • Dmitry (23.04.08 20:48) [8]
    Вощем вотэто нифига не пашет....

    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var ws: widestring;
      f: TextFile;
    begin
     AssignFile(f, 'E:\Projects\ChinaLocalization\LocaleCn.ini');
     Reset(f);

     Readln(f, ws);
     Readln(f, ws);

     Canvas.Font.Name := 'SimSun';
     Canvas.TextOut(10,10, ws);

     CloseFile(f);

    end;
  • Игорь Шевченко © (23.04.08 20:53) [9]
    вот так работает:

    unit Main;

    interface

    procedure Run;

    implementation
    uses
     Windows,
     HsFileMapper;

    procedure Run;
    var
     Data: WideString;
     Mapper: THsFileMapper;
    begin
     Mapper := THSFileMapper.Create(ParamStr(1));
     SetLength(Data, Mapper.FileSize div 2);
     Move(Mapper.Map^, Data[1], Length(Data)*2);
     Data := Copy(Data,2,Length(Data)); //Discard unicode sign
     MessageBoxW(HWND_DESKTOP, PWideChar(Data), 'LoadFile', MB_OK);
    end;

    end.

  • Anatoly Podgoretsky © (24.04.08 00:01) [10]
    > Dmitry  (23.04.2008 20:48:08)  [8]

    А чего это ты приводишь высокоуровневые файловые операции Паскаля в форуме по WinAPI
  • Игорь Шевченко © (24.04.08 00:52) [11]
    В дополнение к Игорь Шевченко ©   (23.04.08 20:53) [9]

    Файл содержит натурально китайский текст, чтобы он отображался, в системе должна быть включена поддержка языков с письмом справа-налево и сложных языков.
  • Dmitry (24.04.08 13:24) [12]
    > Дмитрий С

    2 Файла в архиве.

    LocaleCn.ini - то, что необходимо считать и вывести.
    LocaleCn.pdf - то, как это должно выглядеть.

    http://www.vectools.com/downloads/localecn.rar

    Архив со шрифтом, если необходим (5мегов)

    http://www.vectools.com/downloads/simsun.rar
  • Dmitry (24.04.08 13:44) [13]
    Всем спасибо, все оказалось очень просто:

    procedure TForm1.SpeedButton1Click(Sender: TObject);
    var ini : TIniFile;
       str : WideString;
    begin

     ini:=TIniFile.create(ExtractFilePath(ParamStr(0))+'LocaleCn.ini');
     str:=ini.readString('HeaderForm','InfoLabel.C','');
     ini.destroy;

     canvas.font.name:='SimSun';
     canvas.font.charset:=GB2312_CHARSET ;

     canvas.textout(0,0,str);

    end;

  • Anatoly Podgoretsky © (24.04.08 15:02) [14]
    > Dmitry  (24.04.2008 13:44:13)  [13]

    > str:=ini.readString('HeaderForm','InfoLabel.C','');

    Имеем серьезную проблему с Юникод
  • Dmitry (24.04.08 17:03) [15]

    > > str:=ini.readString('HeaderForm','InfoLabel.C','');
    > Имеем серьезную проблему с Юникод

    Почему ? Все вроде работает...
    До конца пока не проверял, но
    все, что проверял - выводится.
    Даже в большинство контролов, достаточно установить:

    font.name:='SimSun';
    font.charset:=GB2312_CHARSET

    только вот с хинтами проблему нада решить.....
    в хинт хрень валиться...как в нем charset и фонт поменять - непонятно.....
  • Игорь Шевченко © (24.04.08 21:28) [16]

    > только вот с хинтами проблему нада решить.....
    > в хинт хрень валиться...как в нем charset и фонт поменять
    > - непонятно.....


    Использовать TNT Controls
  • Dmitry (25.04.08 08:41) [17]
    TNT использовать ради хинтов - не очень...
    это весь интерфейс надо перемалывать....
    нашел очень полезную библиотечку про хинты - спасибо автору.
    с исходниками, легко можно под себя переваять.
    может еще кому полезно будет:
    http://rouse.drkb.ru/files/fwhint.zip
  • Поп Гапон (06.05.08 18:54) [18]

    > Dmitry   (22.04.08 21:23)
    >
    > Люди подскажите плиз как можно прочитать и вывести (хотябы
    > отрисовать в Canvas) юникодный файл с китайским текстом.
    >
    > Есть текст (txt), есть к нему шрифт. В word открывается
    > все нормально, но как вывести в на форму в дельфи - не врубаюсь.


    1. Шрифт должен поддерживать уникодные символы. Например Arial Unicode MS или региональные стандартные шрифты для разных версий Windows.
    2. Использовать API функцию DrawText(DrawTextW) в которую передавать Canvas.Handle сам текст и прараметры его вывода
    http://msdn.microsoft.com/en-us/library/ms533909(VS.85).aspx
 
Конференция "WinAPI" » Прочитать UNICODE файл с китайским текстом [Win2k, WinXP]
Есть новые Нет новых   [134432   +19][b:0][p:0.001]