|
|
  |
UNICODE |
|
|
|
Nov 24 2010, 08:25
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Keil привел меня в полное недоумение. Он абсолютно не понимает что такое wchar_t. Однако он прекрасно понимает конструкцию L"АБВГ". Поэтому, если wchar_t затайпдефить, то все работает: Код typedef unsigned short wchar_t;
wchar_t u[] = L"АБВГ";
int main (void) { wchar_t *p = u; wchar_t c = 0xffff; while(c != 0) c = *p++; } и в отличие от IAR (привет richie!) генерирует правильные коды букв - 0x0410, 0411, и т.д. Непонятно как такое может быть? Особенно учитывая, что wchar_t упоминается в хелпе и даже есть ключи, якобы делающие его 16- или 32-битным. У меня эти ключи не работают, может поддержку UNICODE еще как-то надо включать?
|
|
|
|
|
Nov 24 2010, 08:59
|
Частый гость
 
Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261

|
Хай!  Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h P.S. Может всё-таки в одной теме вести "расследование"?
|
|
|
|
|
Nov 24 2010, 09:04
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(richie @ Nov 24 2010, 11:38)  Если wchar_t это юникод, то расскажите в какой группе (диапазоне) юникода создана строка "АБВГ"?
Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё. В большинстве случаев для хранения юникода 16 бит достаточно, но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой, правильно интерпретируемой любой системой.
Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ" на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами будут совсем не те, которые подразумевались. Так то вот. На тему юникода можно рссуждать долго, он стал почти религией. Меня же интересует чисто практическое его применение: в устройствах USB все строки передаются в 16-битном UNICODE. Какие пляски и бубны я должен применить чтобы в IAR создать такую строку? В Keil-е мне это удалось сделать сразу. Все остальные компиляторы, к которыми мне приходилось встречаться, тоже кодировали строку вида L"АБВГ" в UNICODE.
|
|
|
|
|
Nov 24 2010, 09:11
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(richie @ Nov 24 2010, 11:59)  Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h Я уже выяснил - оказывается если проект на C++, то wchar_t поддерживается и даже редактор его подсвечивает. На чистом C приходется делать тайпдеф. Мне кажется здесь кейл слегка неправ - в чистом C тоже есть wchar_t. Может есть wchar.h, сейчас поищу, но там наверняка тоже тайпдеф. Цитата(richie @ Nov 24 2010, 11:59)  P.S. Может всё-таки в одной теме вести "расследование"? Да я бы с удовольствием, но нодераторы мудро решили, что IAR надо обсуждать в его разделе, а все остальные компиляторы в ARM. Я бы вообще сократил количество разделов до десятка, но модераторы считают, что сотня разделов крайне удобна для ползователей.
|
|
|
|
|
Nov 24 2010, 10:02
|

Профессионал
    
Группа: Участник
Сообщений: 1 091
Регистрация: 25-07-07
Из: Саратов
Пользователь №: 29 357

|
Цитата(richie @ Nov 24 2010, 12:27)  Разумеется тип wchar_t определён typedef'ом.
Более того, вполне может понадобиться добавить какой-нибудь #define, в виндусе это #define UNICODE, для правильной ветки условной компиляции. В виндовсе #define UNICODE предназначено для других целей - там для строковых типов определяются тайпдефы (такие как TCHAR, LPCTSTR и т.д.) которые в зависимости от того определен ли символ UNICODE делают строки либо из char-ов либо из wchar_t. Но сам wchar_t компилятор понимает всегда, и использовать его можно даже в не-юникодном проекте. Цитата(richie @ Nov 24 2010, 12:27)  P.S. Откройте справку по компилятору и поищи wchar_t, например, в кейле для 51-х для типа wchar_t нужно цеплять файл stdlib.h. Разумеется я смотрел справку с самого начала, там написано что компилятор поддерживает юникод. Цитата(richie @ Nov 24 2010, 12:27)  P.P.S. А в иаре для АВР нужно включить в проект DLIB. Что включить? Впрочем, я все равно решил выбрать кейл, он мне больше понравился.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|