Перейти к содержанию
    

Написал простейшую строку:

 

wchar_t u[] = L"АБВГ";

 

На это он сгенерировал строку символов 0x00c0, 0x00c1, 0x00c2, 0x00c3. То есть компилятор считает, что юникодные символы отличаются от ASCII лишь тем, что имеют размер два байта. Этот компилятор действительно такой тупой или я что-то не так делаю?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не юникод, это вайд-чар.

 

Причём тут компилятор?

Что объявил, то и получил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это не юникод, это вайд-чар.

 

Причём тут компилятор?

Что объявил, то и получил.

Да ну? А что такое по вашему мнению wide char?

Я объявил юникодную строку. Во всяком случае во всех нормальных компиляторах (как минимум WinAVR и Visual Studio) эта строка генерирует юникод.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 еще как-то надо включать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если wchar_t это юникод, то расскажите в какой группе (диапазоне) юникода создана строка "АБВГ"?

 

Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё.

В большинстве случаев для хранения юникода 16 бит достаточно,

но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой,

правильно интерпретируемой любой системой.

 

Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ"

на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами

будут совсем не те, которые подразумевались.

Так то вот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хай! :)

 

Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h

 

P.S. Может всё-таки в одной теме вести "расследование"?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если wchar_t это юникод, то расскажите в какой группе (диапазоне) юникода создана строка "АБВГ"?

 

Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё.

В большинстве случаев для хранения юникода 16 бит достаточно,

но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой,

правильно интерпретируемой любой системой.

 

Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ"

на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами

будут совсем не те, которые подразумевались.

Так то вот.

На тему юникода можно рссуждать долго, он стал почти религией. Меня же интересует чисто практическое его применение: в устройствах USB все строки передаются в 16-битном UNICODE. Какие пляски и бубны я должен применить чтобы в IAR создать такую строку? В Keil-е мне это удалось сделать сразу. Все остальные компиляторы, к которыми мне приходилось встречаться, тоже кодировали строку вида L"АБВГ" в UNICODE.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h

Я уже выяснил - оказывается если проект на C++, то wchar_t поддерживается и даже редактор его подсвечивает. На чистом C приходется делать тайпдеф. Мне кажется здесь кейл слегка неправ - в чистом C тоже есть wchar_t.

 

Может есть wchar.h, сейчас поищу, но там наверняка тоже тайпдеф.

 

P.S. Может всё-таки в одной теме вести "расследование"?

Да я бы с удовольствием, но нодераторы мудро решили, что IAR надо обсуждать в его разделе, а все остальные компиляторы в ARM.

Я бы вообще сократил количество разделов до десятка, но модераторы считают, что сотня разделов крайне удобна для ползователей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумеется тип wchar_t определён typedef'ом.

 

Более того, вполне может понадобиться добавить какой-нибудь #define, в виндусе это #define UNICODE, для правильной ветки условной компиляции.

 

P.S. Откройте справку по компилятору и поищи wchar_t, например, в кейле для 51-х для типа wchar_t нужно цеплять файл stdlib.h.

 

P.P.S. А в иаре для АВР нужно включить в проект DLIB.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

... но модераторы считают ...

1. Чтобы не возникало неоднозначности, надо соответствующим образом именовать темы и располагать их в подобающих разделах. Тема UNICODE, затронутая Вами здесь не имеет никакого отношения к ARM, так что я могу и её отсюда перенести.

2. Это было второе и последнее Ваше обсуждение действий модератора. В следующий раз сообщение будет удалено, а Вы получите предупреждение и надолго.

3. Тщательно читайте правила.

 

Модератор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разумеется тип wchar_t определён typedef'ом.

 

Более того, вполне может понадобиться добавить какой-нибудь #define, в виндусе это #define UNICODE, для правильной ветки условной компиляции.

В виндовсе #define UNICODE предназначено для других целей - там для строковых типов определяются тайпдефы (такие как TCHAR, LPCTSTR и т.д.) которые в зависимости от того определен ли символ UNICODE делают строки либо из char-ов либо из wchar_t. Но сам wchar_t компилятор понимает всегда, и использовать его можно даже в не-юникодном проекте.

P.S. Откройте справку по компилятору и поищи wchar_t, например, в кейле для 51-х для типа wchar_t нужно цеплять файл stdlib.h.

Разумеется я смотрел справку с самого начала, там написано что компилятор поддерживает юникод.

 

P.P.S. А в иаре для АВР нужно включить в проект DLIB.

Что включить? Впрочем, я все равно решил выбрать кейл, он мне больше понравился.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...