Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: UNICODE в WinAVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
777777
Оказывается WinAVR знает о существовании UNICODE. Если написать строку

int Name[] PROGMEM = L"name";

то он ее успешно транслирует. Более того, он знает о существовании типа wchar_t, так как если не поставить L перед строкой, то он выдает ошибку "wchar_t-array initialized from non-wide string". Однако если написать

wchar_t Name[] PROGMEM = L"name";

то он на нее ругается. Но самая главная неприятность - если написать в строке русские буквы

int Name[] PROGMEM = L"Имя устройства";

То он их начисто отказывается понимать. Возникает законный вопрос - насколько далеко у WinAVR просираются знания о UNICODE и если они ограничиваются латинскими буквами - то на фига он нужен?!
zltigo
Цитата(777777 @ Jul 31 2008, 06:42) *
...то на фига он нужен?!

Увы, иногда нужна и латиница, например, идентификаторы USB-ишные sad.gif
777777
Цитата(zltigo @ Jul 31 2008, 11:12) *
Увы, иногда нужна и латиница, например, идентификаторы USB-ишные sad.gif


Иногда? smile.gif ну-ну.
Мне как раз и надо идентификатор USB-шный. Только я хочу назвать его по-русски. Для того юникод и придуман. И если этот крутой gnu-тый компилятр, которым так восхищаются виндовсоненавистники ограничивает свое знание юникода латинскими буквами, то... мне жалко этих несчастных фанатиков.
amw
Цитата(777777 @ Jul 31 2008, 12:51) *
Иногда? smile.gif ну-ну.
Мне как раз и надо идентификатор USB-шный. Только я хочу назвать его по-русски. Для того юникод и придуман. И если этот крутой gnu-тый компилятр, которым так восхищаются виндовсоненавистники ограничивает свое знание юникода латинскими буквами, то... мне жалко этих несчастных фанатиков.

Прежде чем возмущатся неплохо бы подумать что значит поддержка юникода и поместиться ли она во флеш AVR.
А оскорблять людей (в том числе и теоретически существующих ненавистников) найдите другое место.
mdmitry
Цитата(amw @ Jul 31 2008, 15:04) *
Прежде чем возмущатся неплохо бы подумать что значит поддержка юникода и поместиться ли она во флеш AVR.
А оскорблять людей (в том числе и теоретически существующих ненавистников) найдите другое место.

В добавление к amw. Неплохо бы посмотреть поддержку unicode в документации к компилятору smile.gif (ключи компилятора и режимы компиляции).
zltigo
Цитата(amw @ Jul 31 2008, 13:04) *
Прежде чем возмущатся неплохо бы подумать что значит поддержка юникода и ..

Для начала автор описал, что он хочет - просто написать/описать одну юникодную стороку, напимер для последующего побайтного вывода. Для этого ни одного дополнительного бита в библиотеках не надо, поскольку о работе с такими cтроками речь не идет.



Цитата(mdmitry @ Jul 31 2008, 13:20) *
Неплохо бы посмотреть поддержку unicode в документации..

Да, возможно с помощю чего-либо типа указания кодовой страницы исходника удастся решить проблему.
777777
Цитата(amw @ Jul 31 2008, 15:04) *
Прежде чем возмущатся неплохо бы подумать что значит поддержка юникода и поместиться ли она во флеш AVR.


Поддержка юникода - это возможность компилятора генерить строки в юникодной кодировке, ни одного байта во флеше AVR для этого не требуется. И, увидев, что компилятор умеет транслиовать строку L"name" я справедливо решил, что он сможет оттранслировать и L"имя" - а иначе зачем тогда вообще поддержка префикса 'L'?! Оказалось - нет. Надеюсь, вы в состоянии представит мое разочарование. Это примерно то же, как увидеть на дороге кошелек с торчащими из него баксами, наклониться за ним, но тут мальчик, сидящий за кустом дергает за ниточку и вместе со своими друзьями начинает ржать.

Или может все-такие есть какие-то ключи? Ведь кто-то из здесь присутствующих наверняка делал устройства, работающие через USB, неужени вы набивали имя шестнадцатеричными числами?
ukpyr
вообще-то WinAVR - это сборка GCC под Win, AVR-Libc к этому отношения не имеет, поэтому на счет поддержки UNICODE обратитесь к документации на GCC - ведь как-то работают другие программы с UNICODE wink.gif ...
есть там параметры -fexec-charset, -fwide-exec-charset, -finput-charset.
777777
Цитата(ukpyr @ Jul 31 2008, 17:57) *
вообще-то WinAVR - это сборка GCC под Win, AVR-Libc к этому отношения не имеет

Поэтому я пишу в этом разделе, а не в AVR
Цитата(ukpyr @ Jul 31 2008, 17:57) *
поэтому на счет поддержки UNICODE обратитесь к документации на GCC - ведь как-то работают другие программы с UNICODE wink.gif ...

Ну да, в Visual Studio, например, ты просто берешь и пишешь:

И компилятор сразу все понимает без каких-то дополнительных ключей. В конце концов, юникод для того и придумывался, чтобы не думать о кодовых страницах!
Цитата(ukpyr @ Jul 31 2008, 17:57) *
есть там параметры -fexec-charset, -fwide-exec-charset, -finput-charset.

Может тыкнете носом? У меня проблемы с поиском инфы в gcc-шной документации... Нажмите для просмотра прикрепленного файла

И, все-таки, вопрос к тем, кто делал USB-устройства: неужели вы набивали имя шестнадцатеричными числами?
aesok
Цитата(777777 @ Jul 31 2008, 19:06) *
Ну да, в Visual Studio, например, ты просто берешь и пишешь:

И компилятор сразу все понимает без каких-то дополнительных ключей. В конце концов, юникод для того и придумывался, чтобы не думать о кодовых страницах!


А вот Вы не поленитесь и подумайте, в какой кодировке сохранен этот файл? Случайно не в unicode?

А Ваш .с файл (с L"Имя устройства";) в какой? В кодовой станичке 1251? И компилятор дожен сам угадать кодоваю страницу? А что будет этот файл тоже сохранить в unicode?

Анатолий.
ukpyr
эти параметры описаны тут :
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gc...ocessor-Options

-finput-charset задает кодировку исходника,
-fexec-charset - задает кодировку, используемую внутри программы для char строк (по умолчанию UTF-8),
-fwide-exec-charset задает кодировку, используемую внутри программы для wchar строк (UTF-32/16).

В какой кодировке у вас текст ?
777777
Цитата(aesok @ Jul 31 2008, 19:39) *
А вот Вы не поленитесь и подумайте, в какой кодировке сохранен этот файл? Случайно не в unicode?

Не стоит считать всех идиотами. Разумеется в unicode. Только там для этого не приходится извращаться.
Цитата(aesok @ Jul 31 2008, 19:39) *
А Ваш .с файл (с L"Имя устройства";) в какой? В кодовой станичке 1251? И компилятор дожен сам угадать кодоваю страницу?

Вообще-то нет икаких проблем чтобы угадать кодовую страницу. Простейший notepad позволяет сохранять текстовые файлы в любой кодировке и распознает ее при открытии.
Цитата(aesok @ Jul 31 2008, 19:39) *
А что будет этот файл тоже сохранить в unicode?

Тогда он не будет распознаваться IDE-шным редактором. Да-да, я понимаю, она не имеет отношения к gcc. Один пришивает рукав, другой пуговицы. Только что делать юзеру? Похоже так и придется набивать имя в хексе.

Цитата(ukpyr @ Jul 31 2008, 20:36) *
эти параметры описаны тут :
http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gc...ocessor-Options

-finput-charset задает кодировку исходника,
-fexec-charset - задает кодировку, используемую внутри программы для char строк (по умолчанию UTF-8),
-fwide-exec-charset задает кодировку, используемую внутри программы для wchar строк (UTF-32/16).

Спасибо. Осталось выяснить, что писать после charset=... Там ссылаются на iconv library routine, а в ее хелпе никаких значений не приводится.

Кстати, попробовал написать -finput-charset=1251, в результате получил:
cc1.exe: internal compiler error: Segmentation fault
Please submit a full bug report,
with preprocessed source if appropriate.
sad.gif(
Цитата(ukpyr @ Jul 31 2008, 20:36) *
В какой кодировке у вас текст ?

В той, которую понимает IDE, т.е. в ANSI. Других она не понимает.
aesok
Цитата(777777 @ Aug 1 2008, 10:44) *
Осталось выяснить, что писать после charset=... Там ссылаются на iconv library routine, а в ее хелпе никаких значений не приводится.



http://www.gnu.org/software/libiconv/

CP1251

Это в последний раз когда я за вас думаю.

Анатолий.
777777
Цитата(aesok @ Aug 1 2008, 11:04) *

Спасибо, но Segmentation fault осталась. Перепробовал много значений, но работает только когда указываешь UTF-8. Надо будет попробовать другие версии WinAVR.
Цитата(aesok @ Aug 1 2008, 11:04) *
Это в последний раз когда я за вас думаю.

smile.gif
Здесь думать не надо, здесь надо уметь искать gnu-тую информацию, а это нелегко. Даже в MSDN при всей ее уродливости можно найти гораздо легче.
aesok
Цитата(777777 @ Aug 1 2008, 11:43) *
Здесь думать не надо, здесь надо уметь искать gnu-тую информацию, а это нелегко. Даже в MSDN при всей ее уродливости можно найти гораздо легче.


www.google.com

Анатолий.
AHTOXA
У меня на -finput-charset ругается более определённо:
Код
error: no iconv implementation, cannot convert from UTF-8 to CP866


То же самое и с CP1251.

Тогда я сделал проще.

1. Написал строчку в main.c:
Код
int Name[] PROGMEM = L"Супер-пупер";

2. Открыл main.c в блокноте, и сохранил его в формате UTF-8 (под именем main.txt, чтобы остальные строковые константы не испортить).
3. Открыл main.txt в обычном ascii-редакторе (у меня это редактор FAR-а) и скопировал получившуюся строчку (она выглядит примерно так):
Код
int Name[] PROGMEM = L"РЎС_РїРчС_-РїС_РїРчС_";

в мой main.c.

И телемаркет © smile.gif
ukpyr
Ваш редактор не знает UTF-8 ? o_O
возмите хотя-бы notepad++ или scite - там такие конвертеры встроенные.
AHTOXA
Цитата(ukpyr @ Aug 1 2008, 23:30) *
Ваш редактор не знает UTF-8 ? o_O
возмите хотя-бы notepad++ или scite - там такие конвертеры встроенные.


Ну и к чему здесь это ваше высказывание? Мне категорически не надо, чтобы мои исходники были в UTF-8. Поэтому такая поддержка — последняя вещь, которую я оценю в редакторе smile.gif
Просто помог человеку решить его проблему.
amw
Цитата(777777 @ Jul 31 2008, 15:55) *
Ведь кто-то из здесь присутствующих наверняка делал устройства, работающие через USB, неужени вы набивали имя шестнадцатеричными числами?

Код
#define UNICODE(x)        (x), 0x00

const struct USB_STRING_DESCRIPTOR usb_mfg_desc = {
    .bLength        = 2 + 17 * 2,
    .bDescriptorType    = USB_DESC_STRING,
    .bString        = {
        UNICODE('D'),
        UNICODE('A'),
        UNICODE('C'),
        UNICODE(' '),
        UNICODE('I'),
        UNICODE('n'),
        UNICODE('t'),
        UNICODE('e'),
        UNICODE('r'),
        UNICODE('n'),
        UNICODE('a'),
        UNICODE('t'),
        UNICODE('i'),
        UNICODE('o'),
        UNICODE('n'),
        UNICODE('a'),
        UNICODE('l')
    }
};

Думаю модифицировать макрос для нужного языка неслжоно.

PS: Желание использовать какой-либо иной язык, кроме английского, в дескрипторах было напрочь отбито, когда устройство через 2 года производства вставили в ПК с Milenium (помните такую версию винды?) и ее разнесло в "дребезги-пополам" ((С) Жванецкий). Пришлось отзывать 100000 устройств и перешивать дескрипторы. Возможно в XP или Vista дело улучшилось, но предпочитаю не рисковать.

Цитата(AHTOXA @ Aug 1 2008, 21:27) *
2. Открыл main.c в блокноте, и сохранил его в формате UTF-8

А разве UTF-8 катит для дескриптора? Разве там не UTF-16?

bb-offtopic.gif
Цитата
Мне категорически не надо, чтобы мои исходники были в UTF-8.


Мои исходники всегда в UTF-8. И чем это мешае компилятору? Он соответствует ASCII относительно собственно кода.
AHTOXA
Цитата(amw @ Aug 2 2008, 01:45) *
А разве UTF-8 катит для дескриптора? Разве там не UTF-16?


Компилятору нужна была исходная строка в UTF-8. А он её преобразовал в юникод. (я в bin-файле посмотрел)

Цитата(amw @ Aug 2 2008, 01:45) *
Мои исходники всегда в UTF-8. И чем это мешае компилятору? Он соответствует ASCII относительно собственно кода.


А русские строчки? Ну, строковые константы? А таблицы перекодировки для вывода на ЖКИ? А шрифты?
Да ну их, эти геморрои с преобразованием, лучше уж я буду точно знать, что у меня и гдеsmile.gif
777777
Цитата(AHTOXA @ Aug 1 2008, 18:14) *
1. Написал строчку в main.c:
Код
int Name[] PROGMEM = L"Супер-пупер";

2. Открыл main.c в блокноте, и сохранил его в формате UTF-8 (под именем main.txt, чтобы остальные строковые константы не испортить).
3. Открыл main.txt в обычном ascii-редакторе (у меня это редактор FAR-а) и скопировал получившуюся строчку в мой main.c.


В общем, я сделал примерно так же за следующими исключениями:
1. создал файл с единственной строкой
int Name[] PROGMEM = L"имя";
и #include'ил ее в нужном месте в программу.
2. файл создавал редактором Visal Studio, так как блокнот создает utf-8 с сигнатурой в начале файла, а компилятор на эти символы ругается; у Visal Studio больше возможностей редактирования и им можно создать файл в utf-8 без сигнатуры, даже когда открываешь этот файл повторно, он догадывается о его кодировке (несмотря на отсутствие сигнатуры) и предлагает открыть именно как utf-8

Цитата(amw @ Aug 1 2008, 23:45) *
Код
#define UNICODE(x)        (x), 0x00

Думаю модифицировать макрос для нужного языка неслжоно.

А я думаю что сложновато.
Цитата(amw @ Aug 1 2008, 23:45) *
PS: Желание использовать какой-либо иной язык, кроме английского, в дескрипторах было напрочь отбито, когда устройство через 2 года производства вставили в ПК с Milenium (помните такую версию винды?)

Я знаю людей, которые до сих пор пишут комментари по-русски латинскими буквами на том основании, что когда они работали в ДОСе (!) то там было много кодировок и их комментарий мог где-то не прочитаться. Вы чем-то на него похожи: миллениум всеми успешно забыт, а вы все боитесь русских букв. Хотя юникод придуман как раз для того, чтобы он был единственной кодировкой.

Хорошо известно, что юникод поддерживают только NT-based системы; вместо того, чтобы отзывать 1(0...) устройств, следовало бы в инстукции перечислить ОС с которыми ваше устройство работает.
Цитата(amw @ Aug 1 2008, 23:45) *
Мои исходники всегда в UTF-8. И чем это мешае компилятору? Он соответствует ASCII относительно собственно кода.

Тем, что его не понимает редактор AVR-студии. Впрочем, если в нем нет русских букв, то несколько странно утверждать, что он в utf-8 smile.gif
amw
Цитата(AHTOXA @ Aug 2 2008, 00:40) *
Компилятору нужна была исходная строка в UTF-8. А он её преобразовал в юникод. (я в bin-файле посмотрел)
А русские строчки? Ну, строковые константы? А таблицы перекодировки для вывода на ЖКИ? А шрифты?
Да ну их, эти геморрои с преобразованием, лучше уж я буду точно знать, что у меня и гдеsmile.gif

А, понял.
Я пишу коментарии на английсом, а строчки всегда в файлах перевода. Ну в общем в отдельных файлах находятся все сообщения для пользователя. В общем используем подход по аналогии QT Linguist. И переводчикам легче.

Цитата(777777 @ Aug 4 2008, 12:42) *
Я знаю людей, которые до сих пор пишут комментари по-русски латинскими буквами на том основании, что когда они работали в ДОСе (!) то там было много кодировок и их комментарий мог где-то не прочитаться. Вы чем-то на него похожи: миллениум всеми успешно забыт, а вы все боитесь русских букв. Хотя юникод придуман как раз для того, чтобы он был единственной кодировкой.

Можно и меня причислить к ним, хотя и по другой причине. Иногда исходники пытаются скомпилить на виндовс машине, и тогда возникают проблемы с не-латиницей.
Цитата
Хорошо известно, что юникод поддерживают только NT-based системы; вместо того, чтобы отзывать 1(0...) устройств, следовало бы в инстукции перечислить ОС с которыми ваше устройство работает.

Такого подхода я непонимаю. Мои устройства конечно не рботают в ДОС, Вин 3.11 им подобными, но Linux, FreeBSD, Solaris, MacOS 9+, Win98 - NT4 2000 - Vista - обязательны.
Цитата
Тем, что его не понимает редактор AVR-студии. Впрочем, если в нем нет русских букв, то несколько странно утверждать, что он в utf-8 smile.gif

Иногда все же бывают строки на не-английском языке прямо в коде. Про avr-gcc ничего не могу сказать, но по крайней мере i686, x86_64, arm, и под некоторые специфические архитектуры проблем это не вызывает.
ukpyr
Цитата
Хорошо известно, что юникод поддерживают только NT-based системы

07.gif это с каких пор ?
777777
Цитата(ukpyr @ Aug 4 2008, 23:04) *
07.gif это с каких пор ?

Запусти какую-нибудь юникодную программу под Win98 и прочитай что она тебе напишет.
Andrew O. Shadoura
Цитата(777777 @ Aug 5 2008, 08:30) *
Запусти какую-нибудь юникодную программу под Win98 и прочитай что она тебе напишет.


4.2
Если *некоторые* недопрограммы под недоОС, написанные недопрограммистами, не умеют пользоваться тем, что есть, это их индивидуальные интимные проблемы.
Кроме того, никто не отменял независящие от вендора реализации работы с Unicode. Вещи, которые, насколько я знаю, *невозможно* сделать в 9х, — это юникодные заголовки окон, юникодный ввод с клавиатуры (без использования "кодовых страниц"), юникод в терминале. Всё остальное можно либо реализовать самому, используя имеющееся API, либо положиться на реализацию от кого-либо ещё, а таких немало: MSLU (от вендора), GLib и компания, Qt.

--
WBR, Andrew
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.