UNICODE и WINxxx (95,96,97... 2000 :-)
От: Sinatr Германия  
Дата: 13.06.03 14:22
Оценка:
Привет!

Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском). В NT нет никаких проблем — есть функция (моя), которая загружает внешний файл ресурсов (назовем его LNG) и по идентификатору строки + с учетом текущего выбранного языка возвращает UNICODE строку. Для вывода в WM_INITDIALOG загружается UNICODE-шрифт (30М где-то весит!), все контролы (статики, листбоксы и т.д.) получают соотвествующий WM_SETFONT и все это хозяйство инициализируется.

Теперь проблема — работает в NT/XP и не работает в 95\98 (подозреваю, что в 2000 и МЕ тоже).
Почему? Да потому, что почти все функции под UNICODE не работают! Абидна, панимаишь..

Ок, что же делать? Юзаю TextOutW() (ессно перед этим загрузив UNICODE фонт, и установив его в HDC перед этим) — все просто замечательно. Но делать все через owned-draw (я имею в виду АБСОЛЮТНО все — edit, list box, list view, static и т.д.. даже в заголовке окна рисовать самому придется..) меня не очень-то радует.

Нашел ссылку на DBCS (double byte character set) и OEM, попробовал использовать WideCharToMultiByte(), но куда-то делись китайские иероглифы, тоесть он какбы ни все символы переводит, часть из них просто отбрасывает и заменят на знаки вопроса (почему? не в смысле знаки вопроса почему, а почему НЕКОТОРЫЕ? и какие именно?).

А OEM (и кодовые страницы) — для китайского не предназначены, к тому же там че-то сказано про какие-то ограничения (и я не пойму, как тут выводить используя UNICODE-фонт?)..

Что делаеть, уважаемые господа эксперты? Сухари сушить?..
---
ПроГLамеры объединяйтесь..
Re: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Алексей Владимирович Миронов Россия  
Дата: 13.06.03 14:28
Оценка: 3 (2) +1
Здравствуйте, Sinatr, Вы писали:

S>Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском).


<skip>

S>Что делаеть, уважаемые господа эксперты? Сухари сушить?..


А библиотеку Unicows от Microsoft смотрели?
... << RSDN@Home 1.0 beta 6a >>
Re: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Lonely Dog Россия  
Дата: 13.06.03 14:48
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Привет!



S>Теперь проблема — работает в NT/XP и не работает в 95\98 (подозреваю, что в 2000 и МЕ тоже).

В 2000 будет работать. Это ведь тоже WinNT.


А вообще, как уже сказали, используйте Unicows.
Re[2]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Sinatr Германия  
Дата: 13.06.03 15:53
Оценка:
Данке!

А что насчет DBCS? Почему я не вижу иероглифы? Делаю так:

HFONT hfont;
WCHAR buf[256];
char cbuf[512];

//тут в hfont загружен UNICODE фонт (или нужен DBCS?!)
//в buf загружена строка UNICODE длиной 200 символов
//hWnd - диалог, IDC_EDIT - edit box

сbuf[WideCharToMultiByte(CP_ACP,0,cbuf,200,buf,512,NULL,NULL)]=0; //это нолик в конце
SendDlgItemMessage(hWnd,IDC_EDIT,WM_SETFONT,(WPARAM)hfont,1);
SetDlgItemText(hWnd,IDC_EDIT,buf);

И иероглифы пропали в никуда.. жалко..
---
ПроГLамеры объединяйтесь..
Re: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Vadim B  
Дата: 13.06.03 16:04
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>Привет!


S>Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском). В NT нет никаких проблем — есть функция (моя), которая загружает внешний файл ресурсов (назовем его LNG) и по идентификатору строки + с учетом текущего выбранного языка возвращает UNICODE строку. Для вывода в WM_INITDIALOG загружается UNICODE-шрифт (30М где-то весит!), все контролы (статики, листбоксы и т.д.) получают соотвествующий WM_SETFONT и все это хозяйство инициализируется.


Вообще говоря, если приложение выводит все на текущей установленной в системе локали, то оно спокойно живет без юникода. У меня все на MBCS, при этом есть и китайская, и японская версии, не говоря уже про всякие французские и испанские.

S>Нашел ссылку на DBCS (double byte character set) и OEM, попробовал использовать WideCharToMultiByte(), но куда-то делись китайские иероглифы, тоесть он какбы ни все символы переводит, часть из них просто отбрасывает и заменят на знаки вопроса (почему? не в смысле знаки вопроса почему, а почему НЕКОТОРЫЕ? и какие именно?).


S>А OEM (и кодовые страницы) — для китайского не предназначены, к тому же там че-то сказано про какие-то ограничения (и я не пойму, как тут выводить используя UNICODE-фонт?)..


А ты китайскую кодовую страницу в системе установил? Одного шрифта мало.
Re[3]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Алексей Владимирович Миронов Россия  
Дата: 14.06.03 12:50
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>А что насчет DBCS? Почему я не вижу иероглифы?


Unicows перехватывает и обрабатывает SetDlgItemTextW. Вы напрасно преобразуете текст, смело отдавайте ей cbuf в Unicode.
... << RSDN@Home 1.0 beta 6a >>
Re: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 01.04.05 13:00
Оценка:
Прочитал все ответы. Немного кое-что не понял. Может просветите. У меня практически схожая ситуация, только мне надо выводить японские иероглифы на контролы. Windows у меня XP. Иероглифы загружаю в буфер wchar_t* из текстового файла кодировки Unicode, ну и на контролах после вызова SetDlgItemTextW знаки вопроса вместо иероглифов. IDE у меня правда BCB.
А вопрос такой: в самой ОС не надо ничего дополнительно настраивать, шрифты может какие-нибудь установить дополнительные для японских иероглифов, японскую кодовую страницу особенную и т.д.
Re[2]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Stanky  
Дата: 01.04.05 21:59
Оценка:
> шрифты может какие-нибудь установить дополнительные для японских
> иероглифов
>
Именно это и нужно!!!
Один из самых полных шрифтов, которые я встречал — Arial Unicode MS, идёт вместе с Office'ом!!!

> японскую кодовую страницу особенную и т.д.

>
Этого не надо, так как Unicode!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[3]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 02.04.05 10:42
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Именно это и нужно!!!

S>Один из самых полных шрифтов, которые я встречал — Arial Unicode MS, идёт вместе с Office'ом!!!

    wchar_t buf[3], fName[] = L"ieroglif.txt";
    int hFile = _wopen(fName, O_RDWR | O_TEXT);

    read(hFile, buf, filelength(hFile));
    close(hFile);
    SetDlgItemTextW(m_hWnd, IDC_STATIC, buf); // в VC6.0
    SetDlgItemTextW(Handle,GetDlgCtrlID(StaticText1->Handle),buf); // в BCB6.0

После установки этого шрифта этот код заработал в IDE VC6.0 c поправкой что только вместе с нужными иероглифами из файла следом выводятся еще 12 каких-то левых.
В ВСВ6.0 как выводились знаки вопроса так и выводятся.
Re[4]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Stanky  
Дата: 02.04.05 11:39
Оценка:
> После установки этого шрифта этот код заработал в IDE VC6.0 c поправкой
> что только вместе с нужными иероглифами из файла следом выводятся еще
> 12 каких-то левых.
>
Скорее всего это происходит из-за того, что файл открывается, как текстовый: _wopen(fName, O_RDWR | O_TEXT);!!!
А читаешь ты весь его размер: filelength(hFile))!!!
Текстовый отличается тем, что переход на новую строку реализуется одним "символом", а не двумя — вот и набегает 12 левых!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[4]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Stanky  
Дата: 02.04.05 11:50
Оценка:
Кстати, а почему так: wchar_t buf[3]?
И совсем забыл сказать, что после того как прочитаешь данные из файла нужно поставить нуль-символ в конце!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[5]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 02.04.05 12:59
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Кстати, а почему так: wchar_t buf[3]?

S>И совсем забыл сказать, что после того как прочитаешь данные из файла нужно поставить нуль-символ в конце!!!

Ну размер файла у меня 6 байт. 6/2 = 3, вот и wchar_t buf[3]. Вообще то для меня странно было, почему размер файла с двумя иероглифами в 6 байт, а не 4.
Re[6]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Stanky  
Дата: 02.04.05 13:46
Оценка:
> Ну размер файла у меня 6 байт. 6/2 = 3, вот и wchar_t buf[3].
>
Ну дык ты определись, либо всё делаешь динамически, либо всё статически!!!
wchar_t Text[3];
HANDLE hFile = CreateFile(TEXT("ieroglif.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
DWORD BytesTransferred;
ReadFile(hFile, Text, 2 * sizeof(wchar_t), &BytesTransferred, NULL);
Text[2] = L'\0';    //Это нужно сделать в обязательном порядке, иначе будут левые символы!!!
CloseHandle(hFile);


> Вообще то для меня странно было, почему размер файла с двумя иероглифами в

> 6 байт, а не 4.
>
Можешь его выложить?
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Re[7]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 05.04.05 08:55
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Ну дык ты определись, либо всё делаешь динамически, либо всё статически!!!

S>
S>wchar_t Text[3];
S>HANDLE hFile = CreateFile(TEXT("ieroglif.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
S>DWORD BytesTransferred;
S>ReadFile(hFile, Text, 2 * sizeof(wchar_t), &BytesTransferred, NULL);
S>Text[2] = L'\0';    //Это нужно сделать в обязательном порядке, иначе будут левые символы!!!
S>CloseHandle(hFile);
S>


>> Вообще то для меня странно было, почему размер файла с двумя иероглифами в

>> 6 байт, а не 4.
>>
S>Можешь его выложить?
Приведенный тобой код выводит один иероглиф из двух что в файле, поэтому прилагаю файл
http://www.rsdn.ru:80/File/39986/ieroglif.txt
P.S. Если интересно эти два иероглифа означают англ. All
Re[7]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 05.04.05 09:52
Оценка:
Здравствуйте, Stanky, Вы писали:

S>Ну дык ты определись, либо всё делаешь динамически, либо всё статически!!!

S>
S>wchar_t Text[3];
S>HANDLE hFile = CreateFile(TEXT("ieroglif.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
S>DWORD BytesTransferred;
S>ReadFile(hFile, Text, 2 * sizeof(wchar_t), &BytesTransferred, NULL);
S>Text[2] = L'\0';    //Это нужно сделать в обязательном порядке, иначе будут левые символы!!!
S>CloseHandle(hFile);
S>


Рабочим оказался вариант
wchar_t Text[4];
HANDLE hFile = CreateFile(TEXT("ieroglif.txt"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
DWORD BytesTransferred;
ReadFile(hFile, Text, 3 * sizeof(wchar_t), &BytesTransferred, NULL);
Text[3] = L'\0';    //Это нужно сделать в обязательном порядке, иначе будут левые символы!!!
CloseHandle(hFile);

Вообщем спасибо за помощь.
Re[7]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 05.04.05 13:40
Оценка:
Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.
Re[8]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: noesis  
Дата: 06.04.05 06:53
Оценка:
Здравствуйте, oleg_dm, Вы писали:

_>Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.


В BCB
icq 323-145-728
Re[9]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 06.04.05 08:55
Оценка:
Здравствуйте, noesis, Вы писали:

N>Здравствуйте, oleg_dm, Вы писали:


_>>Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.


N>В BCB


Что не фиг пытатся, ничего не выйдет чтоли?
Re[10]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: noesis  
Дата: 06.04.05 10:00
Оценка:
Здравствуйте, oleg_dm, Вы писали:

_>Что не фиг пытатся, ничего не выйдет чтоли?


Почему же, выйдет конечно, но приложить надо немеряно усилий. это мое субъективное, конечно, имхо, да и ламер я порядочный, но у меня огромная, неотъемлемая неприязнь к BCB, и я даже не хочу вникать почему нормальный рабочий код который написан следуя букве msdn и platform sdk, прекрасно компиляется компиляторами от MS, компилятор от борланда так криво воспринимает и порождает неверное представление о работе Windows платформ. Но конструктор и событийная логика у них конечно крутая, тут слов нет. Нет, не спорю, можно конечно скомпилировать и bcb код без <vcl.h>, но сколько же усилий для этого нужно, и при этом еще вникнуть как все это работает, да и зачем изучать молоток? Лишняя информация имхо.

зы. Звиняйте, наболело... на работе заставляют писать на bcb.
icq 323-145-728
Re[11]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: oleg_dm  
Дата: 06.04.05 12:19
Оценка:
Здравствуйте, noesis, Вы писали:

N>Здравствуйте, oleg_dm, Вы писали:


_>>Что не фиг пытатся, ничего не выйдет чтоли?


N>Почему же, выйдет конечно, но приложить надо немеряно усилий. это мое субъективное, конечно, имхо, да и ламер я порядочный, но у меня огромная, неотъемлемая неприязнь к BCB, и я даже не хочу вникать почему нормальный рабочий код который написан следуя букве msdn и platform sdk, прекрасно компиляется компиляторами от MS, компилятор от борланда так криво воспринимает и порождает неверное представление о работе Windows платформ. Но конструктор и событийная логика у них конечно крутая, тут слов нет. Нет, не спорю, можно конечно скомпилировать и bcb код без <vcl.h>, но сколько же усилий для этого нужно, и при этом еще вникнуть как все это работает, да и зачем изучать молоток? Лишняя информация имхо.


N>зы. Звиняйте, наболело... на работе заставляют писать на bcb.


В принципе решил я эту проблему, найдя компоненты, которые Unicode выводят без проблем. Просто изначально не хотел c компонентами лишними заморачиватся. Если вдруг понадобятся доступны по этой ссылке http://www.tntware.com/delphicontrols/unicode/downloads.htm. Там и для BCB и для Delphi.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.