Здравствуйте, Sinatr, Вы писали:
S>Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском).
Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском). В 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-фонт?)..
Что делаеть, уважаемые господа эксперты? Сухари сушить?..
Здравствуйте, Sinatr, Вы писали:
S>Привет!
S>Пытаюсь сделать приложение, которое может выводить все свои сообщения и диалоги на любом языке (в том числе и на китайском). В NT нет никаких проблем — есть функция (моя), которая загружает внешний файл ресурсов (назовем его LNG) и по идентификатору строки + с учетом текущего выбранного языка возвращает UNICODE строку. Для вывода в WM_INITDIALOG загружается UNICODE-шрифт (30М где-то весит!), все контролы (статики, листбоксы и т.д.) получают соотвествующий WM_SETFONT и все это хозяйство инициализируется.
Вообще говоря, если приложение выводит все на текущей установленной в системе локали, то оно спокойно живет без юникода. У меня все на MBCS, при этом есть и китайская, и японская версии, не говоря уже про всякие французские и испанские.
S>Нашел ссылку на DBCS (double byte character set) и OEM, попробовал использовать WideCharToMultiByte(), но куда-то делись китайские иероглифы, тоесть он какбы ни все символы переводит, часть из них просто отбрасывает и заменят на знаки вопроса (почему? не в смысле знаки вопроса почему, а почему НЕКОТОРЫЕ? и какие именно?).
S>А OEM (и кодовые страницы) — для китайского не предназначены, к тому же там че-то сказано про какие-то ограничения (и я не пойму, как тут выводить используя UNICODE-фонт?)..
А ты китайскую кодовую страницу в системе установил? Одного шрифта мало.
Прочитал все ответы. Немного кое-что не понял. Может просветите. У меня практически схожая ситуация, только мне надо выводить японские иероглифы на контролы. Windows у меня XP. Иероглифы загружаю в буфер wchar_t* из текстового файла кодировки Unicode, ну и на контролах после вызова SetDlgItemTextW знаки вопроса вместо иероглифов. IDE у меня правда BCB.
А вопрос такой: в самой ОС не надо ничего дополнительно настраивать, шрифты может какие-нибудь установить дополнительные для японских иероглифов, японскую кодовую страницу особенную и т.д.
> шрифты может какие-нибудь установить дополнительные для японских > иероглифов >
Именно это и нужно!!!
Один из самых полных шрифтов, которые я встречал — Arial Unicode MS, идёт вместе с Office'ом!!!
> японскую кодовую страницу особенную и т.д. >
Этого не надо, так как Unicode!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, 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 как выводились знаки вопроса так и выводятся.
> После установки этого шрифта этот код заработал в IDE VC6.0 c поправкой > что только вместе с нужными иероглифами из файла следом выводятся еще > 12 каких-то левых. >
Скорее всего это происходит из-за того, что файл открывается, как текстовый: _wopen(fName, O_RDWR | O_TEXT);!!!
А читаешь ты весь его размер: filelength(hFile))!!!
Текстовый отличается тем, что переход на новую строку реализуется одним "символом", а не двумя — вот и набегает 12 левых!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!
Здравствуйте, Stanky, Вы писали:
S>Кстати, а почему так: wchar_t buf[3]? S>И совсем забыл сказать, что после того как прочитаешь данные из файла нужно поставить нуль-символ в конце!!!
Ну размер файла у меня 6 байт. 6/2 = 3, вот и wchar_t buf[3]. Вообще то для меня странно было, почему размер файла с двумя иероглифами в 6 байт, а не 4.
Здравствуйте, 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
Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.
Здравствуйте, oleg_dm, Вы писали:
_>Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.
Здравствуйте, noesis, Вы писали:
N>Здравствуйте, oleg_dm, Вы писали:
_>>Да и последний вопрос. Это все теперь работает в VC. А C++Builder иероглифы отображать не хочет. Вместо них постоянно default-символы ('?'). Код тот же самый, что и в VC — никакой привязки к IDE нет. В чем тут теперь трабла.
N>В BCB
Здравствуйте, oleg_dm, Вы писали:
_>Что не фиг пытатся, ничего не выйдет чтоли?
Почему же, выйдет конечно, но приложить надо немеряно усилий. это мое субъективное, конечно, имхо, да и ламер я порядочный, но у меня огромная, неотъемлемая неприязнь к BCB, и я даже не хочу вникать почему нормальный рабочий код который написан следуя букве msdn и platform sdk, прекрасно компиляется компиляторами от MS, компилятор от борланда так криво воспринимает и порождает неверное представление о работе Windows платформ. Но конструктор и событийная логика у них конечно крутая, тут слов нет. Нет, не спорю, можно конечно скомпилировать и bcb код без <vcl.h>, но сколько же усилий для этого нужно, и при этом еще вникнуть как все это работает, да и зачем изучать молоток? Лишняя информация имхо.
зы. Звиняйте, наболело... на работе заставляют писать на bcb.
Здравствуйте, 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.
> Приведенный тобой код выводит один иероглиф из двух что в файле, > поэтому прилагаю файл >
А весит текстовый файл с 2 иероглифами не 4 байта лишь потому, что у мелкомягких принят "стандарт" для Unicod'овского текста — вначале идёт сигнатура 0xFF, 0xFE!!!
Posted via RSDN NNTP Server 1.9
Не бойся выглядеть глупо, от этого ты выглядишь ещё глупей!!!