777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Написал простейшую строку: wchar_t u[] = L"АБВГ"; На это он сгенерировал строку символов 0x00c0, 0x00c1, 0x00c2, 0x00c3. То есть компилятор считает, что юникодные символы отличаются от ASCII лишь тем, что имеют размер два байта. Этот компилятор действительно такой тупой или я что-то не так делаю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
richie 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Это не юникод, это вайд-чар. Причём тут компилятор? Что объявил, то и получил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Это не юникод, это вайд-чар. Причём тут компилятор? Что объявил, то и получил. Да ну? А что такое по вашему мнению wide char? Я объявил юникодную строку. Во всяком случае во всех нормальных компиляторах (как минимум WinAVR и Visual Studio) эта строка генерирует юникод. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба 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 еще как-то надо включать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
richie 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Если wchar_t это юникод, то расскажите в какой группе (диапазоне) юникода создана строка "АБВГ"? Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё. В большинстве случаев для хранения юникода 16 бит достаточно, но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой, правильно интерпретируемой любой системой. Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ" на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами будут совсем не те, которые подразумевались. Так то вот. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
richie 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Хай! :) Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h P.S. Может всё-таки в одной теме вести "расследование"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Если wchar_t это юникод, то расскажите в какой группе (диапазоне) юникода создана строка "АБВГ"? Сделав объявление wchar_t u[] вы объявили строку типа вайд-чар и всё. В большинстве случаев для хранения юникода 16 бит достаточно, но это не означает что инициализация строкой L"АБВГ" автоматически сделана правильной юникод-строкой, правильно интерпретируемой любой системой. Коды символов "0x00c0, 0x00c1, 0x00c2, 0x00c3", автоматически сгенерерированные компилятором на L"АБВГ" на самом соответствуют диапазону "Latin-1" (коды с 128 по 255). И отображаемые символы с этими кодами будут совсем не те, которые подразумевались. Так то вот. На тему юникода можно рссуждать долго, он стал почти религией. Меня же интересует чисто практическое его применение: в устройствах USB все строки передаются в 16-битном UNICODE. Какие пляски и бубны я должен применить чтобы в IAR создать такую строку? В Keil-е мне это удалось сделать сразу. Все остальные компиляторы, к которыми мне приходилось встречаться, тоже кодировали строку вида L"АБВГ" в UNICODE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Сейчас кейла под арм не стоит на машине, но попробуй прицепить в проект файл wchar.h Я уже выяснил - оказывается если проект на C++, то wchar_t поддерживается и даже редактор его подсвечивает. На чистом C приходется делать тайпдеф. Мне кажется здесь кейл слегка неправ - в чистом C тоже есть wchar_t. Может есть wchar.h, сейчас поищу, но там наверняка тоже тайпдеф. P.S. Может всё-таки в одной теме вести "расследование"? Да я бы с удовольствием, но нодераторы мудро решили, что IAR надо обсуждать в его разделе, а все остальные компиляторы в ARM. Я бы вообще сократил количество разделов до десятка, но модераторы считают, что сотня разделов крайне удобна для ползователей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
richie 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Разумеется тип wchar_t определён typedef'ом. Более того, вполне может понадобиться добавить какой-нибудь #define, в виндусе это #define UNICODE, для правильной ветки условной компиляции. P.S. Откройте справку по компилятору и поищи wchar_t, например, в кейле для 51-х для типа wchar_t нужно цеплять файл stdlib.h. P.P.S. А в иаре для АВР нужно включить в проект DLIB. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба ... но модераторы считают ... 1. Чтобы не возникало неоднозначности, надо соответствующим образом именовать темы и располагать их в подобающих разделах. Тема UNICODE, затронутая Вами здесь не имеет никакого отношения к ARM, так что я могу и её отсюда перенести. 2. Это было второе и последнее Ваше обсуждение действий модератора. В следующий раз сообщение будет удалено, а Вы получите предупреждение и надолго. 3. Тщательно читайте правила. Модератор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 24 ноября, 2010 Опубликовано 24 ноября, 2010 · Жалоба Разумеется тип 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. Что включить? Впрочем, я все равно решил выбрать кейл, он мне больше понравился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться