реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> UNICODE
777777
сообщение Nov 24 2010, 07:14
Сообщение #1


Профессионал
*****

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



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

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

На это он сгенерировал строку символов 0x00c0, 0x00c1, 0x00c2, 0x00c3. То есть компилятор считает, что юникодные символы отличаются от ASCII лишь тем, что имеют размер два байта. Этот компилятор действительно такой тупой или я что-то не так делаю?
Go to the top of the page
 
+Quote Post
richie
сообщение Nov 24 2010, 07:22
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



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

Причём тут компилятор?
Что объявил, то и получил.
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 24 2010, 07:33
Сообщение #3


Профессионал
*****

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



Цитата(richie @ Nov 24 2010, 10:22) *
Это не юникод, это вайд-чар.

Причём тут компилятор?
Что объявил, то и получил.

Да ну? А что такое по вашему мнению wide char?
Я объявил юникодную строку. Во всяком случае во всех нормальных компиляторах (как минимум WinAVR и Visual Studio) эта строка генерирует юникод.
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 24 2010, 08:25
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 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 еще как-то надо включать?
Go to the top of the page
 
+Quote Post
richie
сообщение Nov 24 2010, 08:38
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



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

Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё.
В большинстве случаев для хранения юникода 16 бит достаточно,
но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой,
правильно интерпретируемой любой системой.

Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ"
на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами
будут совсем не те, которые подразумевались.
Так то вот.
Go to the top of the page
 
+Quote Post
richie
сообщение Nov 24 2010, 08:59
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



Хай! smile.gif

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

P.S. Может всё-таки в одной теме вести "расследование"?
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 24 2010, 09:04
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 24 2010, 09:11
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 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.
Я бы вообще сократил количество разделов до десятка, но модераторы считают, что сотня разделов крайне удобна для ползователей.
Go to the top of the page
 
+Quote Post
richie
сообщение Nov 24 2010, 09:27
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



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

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

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

P.P.S. А в иаре для АВР нужно включить в проект DLIB.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 24 2010, 09:38
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(777777 @ Nov 24 2010, 11:11) *
... но модераторы считают ...

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

Модератор.
Go to the top of the page
 
+Quote Post
777777
сообщение Nov 24 2010, 10:02
Сообщение #11


Профессионал
*****

Группа: Участник
Сообщений: 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.

Что включить? Впрочем, я все равно решил выбрать кейл, он мне больше понравился.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.0143 секунд с 7
ELECTRONIX ©2004-2016