![]() |
|
|
![]()
|
|
| Glorious |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 7.3.2005 Репутация: нет Всего: нет |
Добрый вечер!
Подскажите пожалуйста, как нормально работать с Unicode и MFC в VC++ 6.0 либо 2003? Студия юникодные ресурсы не может редактировать. Поэтому как, например, создать надпись на контролле в юникодном проекте. Английский - он и в африке английский! Однобайтовый английский переносится в Виндовый Юникод простым добавлением 0x00 перед каждым символом. А вот с русским так не получается, конечно... Поэтому хранимый в ресурсах однобайтовая русская строка в Виндовый Юникод перенесется таким же способом - что неправильно. Знаю один способ - файл ресурсов перевести в Unicode и откомпилировать. Все будет нормально, русские символы с ресурсов на контроллах нормально отобразятся. Но редактировать-то Юникодный файл ресурсов нельзя! Получается, я должен опять подсунуть студии ANSI версию. Но дебаггить программу так неудобно - постоянно нужно гонять *.rc файл туда-сюда... Профессионалы! Как вы пишите Unicodn-ые программы? Может, Вы знаете какие-нибудь ресурсы на эту тему? Спасибо! |
|||
|
||||
| Coocky |
|
|||
![]() GUI гуру ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2879 Регистрация: 16.2.2004 Где: Украина. Запорожь е Репутация: 25 Всего: 62 |
Я не много не понял вопрос.Можно еще раз в одной строке-разрешение какой проблемы нужно?
-------------------- Верю в смерть после жизни, в любовь после секса ,в крем после бритья |
|||
|
||||
| Гость_юзер |
|
|||
|
Unregistered |
В свойствах проекта нужно включить макрос _UNCODE и убрать макрос _MBCS и работать с проектом как обычно. Он скомпилиться как надо. Потому что в этом случае компилятор будет знать что Всякие макросы типа _TEXT и функции нужно компилить в UNICODE версии. И все
|
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
В ресурсах строки всегда хранятся в UNICODE. Однако нужно правильно поставить язык ресурсов. Имеется в виду, конечно, не исходный rc-файл. И зачем его редактировать руками? Редактор ресурсов Studio вполне справляется... -------------------- ... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: нет Всего: 3 |
Да в общем-то ничего делать и не надо. Только _T("...") где есть текст. Операции сравнения и работы со строками типа _tstrcpy - не помню точно, но если почитаь вторую главу Рихтера, то проблем нет. Да, еще вместо char использовать TCHAR и все! Хочешь Ansi - поставь в свойствах проекта однобайтовый, хочешь Unicode - широкобайтоваый.... У меня проблем с ресурсами не возникало, может я просто не профессионал...
-------------------- я не гольфист - я хоккеист |
|||
|
||||
| CaptainFlint |
|
|||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
Glorious
Эх, у меня тоже такая же проблема. Вроде бы Unicode - стандарт для NT-ёвых ядер, а вот с созданием таких программ замучаешься...
Сделай в редакторе ресурсов диалог, на котором одна кнопка с китайским текстом, вторая - с английским, третья - с русским. Кроме как создать три пустые кнопки, перевести ручками RC-файл в Unicode-формат, и уже в нём, опять-таки ручками прописать текст - другого способа я не вижу. А в результате такого способа шестая студия откажется вообще такой файл ресурсов открывать (а может даже и компилять, не помню уже), а седьмая откроет, но редактировать откажется. То же самое касается файлов исходного кода. Кроме как в Unicode-формате, вряд ли удастся инициализировать строчки смесью разноязыковых символов, и никакие _T с _UNICODE'ом не помогут. Единственный способ - инициализировать массив явным перечислением шестнадцатеричных кодов. Т.е. вместо строки (не знаю, как где, в Опере её видно нормально): TCHAR* str = "русский über alles, 癉뛺"; что было бы просто, удобно и понятно, приходится писать: TCHAR* str = {0x0440, 0x0443, 0x0441, 0x0441, 0x043A, 0x0438, 0x0439, 0x0020, 0x00FC, 0x0062, 0x0065, 0x0072, 0x0020, 0x0061, 0x006C, 0x006C, 0x0065, 0x0073, 0x002C, 0x0020, 0x7649, 0xB6FA}; Ну и так далее. Короче, основная проблема в том, что Студии не умеют работать с юникодными файлами - отсюда и все проблемы. -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
"Видно нормально", как мне кажется, зависит от того, что у вас в Windows установлено, а не от софта, в котором смотрите. Если нет у меня японского (или что у вас там), так и вижу я сплошные квадратики.
Проблема, как я понимаю, в том, что в одном ресурсе нужно смешать строки на разных языках? Да, неожиданная постановка вопроса. А нельзя ли строки на разных языках разнести по разным таблицам строк, каждая для своего языка? Тогда, мне кажется, все должно быть видно и редактироваться нормально. Конечно, строки в диалог придется грузить руками, но раз уж такая хитрая задача стоит, можно выработать внутренние правила и написать код по замене строк один раз. -------------------- ... |
|||
|
||||
| CaptainFlint |
|
||||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
А, да, не подумал. У меня просто шрифт Arial Unicode установлен. Видимо, он подхватывается.
Да я понимаю, что всё это можно реализовать, я же не говорил, что проблема нерешаема. Я просто привёл примеры, когда отсутствие возможности работы с Unicode-файлами приводит к проблемам, к тому, что надо выполнять кучу дополнительных действий. Если бы была реализована нормальная работа с Unicode - то вопрос о решении подобных проблем не ставился бы. Да и самих проблем-то не существовало бы вообще! И это вызывает удивление, поскольку ядро NT-систем построено целиком и исключительно на Unicode, а MS, которая сама всё это реализовала, не предоставляет никаких нормальных инструментов для того, чтобы можно было использовать всю мощь Unicode. -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Ну, что касается ресурсов, то формат-то (RES) довольно старый, и он предполагает единые языковые установки на ресурс. Если посмотреть функции API на тему ресурсов, то видно, что все основано как раз на концепции одного языка на ресурс: можно получить список ресурсов для данного языка, можно выбрать ресурс в зависимости от языка... и т.д. Ясно, что никто эту концепцию менять не будет.
Согласись, задача не очень распространенная - иметь внутри одного диалога поля на разном языке. Вообще, не очень понятно, почему не получается в редакторе ресурсов написать строку на смеси языков. Если соответствующая поддержка языка установлена, и, скажем, в ворде вы можете писать на русско-китайской смеси, то в чем разница? Другое дело, студия может неправильно отображать поля (на тесте и при запуске), если язык не соответствует... Но может попробовать поставить Language Neutral? -------------------- ... |
|||
|
||||
| CaptainFlint |
|
||||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
И всё-таки, можно было бы это реализовать как расширение. Кстати, насчёт концепций: если посмотреть на скомпилированный EXE-файл, то видно, что многие (если не все) ресурсы и так хранятся там в виде Unicode! Так что не слишком-то концептуальной получается эта языковая концепция...
Дело не в том, какой язык поставить, а в том, что невозможно в файле с кодировкой ANSI вписать текст сразу на нескольких разных языках, не влезающих в одну кодовую страницу. Ведь RC-файл должен иметь именно ANSI-формат. Ворд редактирует не текстовый файл, а многоформатный. Попробуй сделать в ворде смешанный многоязыковой текст и сохранить его как текстовый файл. Он тебя пошлёт куда подальше, сказав, что некоторые символы невозможно сохранить в данной кодировке. -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
||||
|
|||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Слушай, только сейчас увидела: в 7 студии, оказывается можно открыть rc-файл как UNICODE, редактировать его он вполне позволяет. Правая клавиша на rc-файле в Solution, Open With, и выбираешь из списка то, что нравится...
У меня сейчас никаких языков не установлено, поэтому проверить не могу. Может, попробуешь? -------------------- ... |
|||
|
||||
| CaptainFlint |
|
|||
|
Искатель сокровищ ![]() ![]() Профиль Группа: Участник Сообщений: 393 Регистрация: 26.2.2003 Где: Москва Репутация: 7 Всего: 23 |
Да, в виде текстового файла нормально редактирует, хотя и требует немножко поплясать с бубном: сделать сначала обычный Open, подредактировать, как надо, вызвать Save As, в появившемся диалоге у кнопочки Save ткнуться на стрелочку, величаво указующую вниз, выбрать в вывалившейся менюшке пункт Save with Encoding, там указать Unicode, и наконец-то в виде награды за ваше долготерпение файл будет сохранён в нужном формате. И исходные файлы, как оказалось, всё-таки нормально понимаются, редактируются и компиляются, так что на этот счёт зря я поклёп возводил на студию - это в шестой версии юникод-файлы в упор не признаются, а в седьмой с этим получше дело обстоит. Так что, с учётом всего вышесказанного, список неудобств следующий: 1. Надо делать много лишних действий для перевода нужных файлов в Unicode-формат. Проще сделать это внешним редактором, чем самой Студией. 2. Полное непонимание юникода редактором ресурсов (не путать с редактированием файла ресурсов в текстовом виде! -------------------- Почему же, ё-моё, ты нигде не пишешь "ё"? -------------------- Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Да... уж
Ну тогда прослеживаются 2 варинта действий: 1) Если таких ресурсов немного и изменять нужно нечасто, то выделяем это все в отдельный ресурс, проделываем все эти проктологические упражнения один раз и забываем, как страшный сон - до следующего раза. 2) В противоположной ситуации, когда много и/или часто, лучше поберечь нервные клетки и написать один раз код, который будет какие-нибудь специальные крюказябры заменять на нужные строки по определенным правилам. Собственно, это я уже писала... А также надеятся, что процессы глобализации когда-нибудь вынудят MS переписать редактор ресурсов, и мы до этого доживем. -------------------- ... |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |