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 >>
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 :-)
От: 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.
Re[8]: UNICODE и WINxxx (95,96,97... 2000 :-)
От: Stanky  
Дата: 19.04.05 20:09
Оценка:
> Приведенный тобой код выводит один иероглиф из двух что в файле,
> поэтому прилагаю файл
>
А весит текстовый файл с 2 иероглифами не 4 байта лишь потому, что у мелкомягких принят "стандарт" для Unicod'овского текста — вначале идёт сигнатура 0xFF, 0xFE!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.