![]() |
|
Модераторы: xvr |
![]()
|
|
| proc_maker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: 1 Всего: 1 |
Здавствуйте эксперты!
Как сделать посимволное чтение в юникодовской строке, т.е. что-то типа const char *strUtf8="........"; for (int i=0; i<strlen(strUtf8); i++) { char c=strUtf8[i]; } но для многобайтной строк в UTF-8? Спасибо! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
А в чем собственно проблема?
|
|||
|
||||
| V.A.KeRneL |
|
|||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: нет Всего: 14 |
bsa, проблема в Юникоде!
Мне тоже тема интересна. Может кто-то из гуру, например MAKCim, поможет ньюбам... -------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
Это сообщение отредактировал(а) MAKCim - 12.2.2007, 10:36 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| V.A.KeRneL |
|
|||
![]() Vadim A. Kazantsev ![]() ![]() Профиль Группа: Участник Сообщений: 291 Регистрация: 3.12.2006 Где: Moscow, Russia Репутация: нет Всего: 14 |
Ну, что я говорил! Тхеньк ю вери мач, MAKCim.
proc_maker, имхо, тему мона прикрыть, ещё разок от себя поблагодарив отзывчевого эксперта за помощь. -------------------- «C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы» ---/)/)---(\.../)---(\(\ --(':'=)---(=';'=)---(=':') (")(")..)-(").--.(")-(..(")(") |
|||
|
||||
| proc_maker |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: 1 Всего: 1 |
А проблема именно в том что strlen(txt) != COUNT_BYTES_IN_LINE потому как каждый символ может кодироваться одним-тремя байтами. Это раз. да и цеплять для такой операции iostream мне не хотелось бы Добавлено @ 12:32
ООО, да. помоему это именно то что надо, если я правильно понимаю, выполнив вместо /* [__utf_array ... __utf_array + index ) содержит то, что надо */ чтото типа char *symbol=new char [bits+1]; bzero(symbol, bits+1); memcpy(symbol, __utf_array, bits); printf("%s\n", symbol); ... я увижу (при str=="строка") с т р о к а Правильно я понял? PS. Огромное спасибо!! Простите что сразу не отреагировал на Ваш ответ, работа... Ееще раз thanks! |
||||||||
|
|||||||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 3 Всего: 44 |
а чем wstring не нравиться?
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
proc_maker,
прочитай сначала то, что в ссылке выше -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| proc_maker |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 84 Регистрация: 11.11.2006 Репутация: 1 Всего: 1 |
Что именно? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
все и потом посмотри принцип преобразования и что лежит в __utf_array Это сообщение отредактировал(а) MAKCim - 16.2.2007, 20:58 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| georain |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Объясните пожалуйста.
Вот я написал:
Что лежит в коде или в памяти программы? Если там лежит строка в формате utf8(или другой Unicode), то каким образом осуществляется переход от старых компиляторов которые ничего об Unicode не знают? Если там не Unicode то как вообще чего происходит? Как разные компиляторы ведут себя с этим, вроде Unicode даже в стандарте ещё пока нет? Далее, я пишу строку:
Как эта строка выводится на экран физически? Кто реализует функциональность Unicode, библиотеки типа glibc или моя программа? И последний вопрос, я пишу:
Ввожу в консоли: "hello" или "привет", что будет в str (в случае не utf8 и utf8 консоли)? Ничего не понимаю, и не нашёл ничего нормального, а по ссылке выше: "Our servers are on a coffee break." P.S. И вот ещё вопрос, например хочу ввести utf8 строку, передать её по сети (или пропустить через буфер) и вывести на экран, это всё можно сделать манипулируя только указателями (без преобразований)? Опять же тут вопрос, что лежит в строке. P.S.S. И зачем wstring? Всё на сегодня вопросы все. Это сообщение отредактировал(а) georain - 1.5.2008, 00:28 |
||||||
|
|||||||
| MHz |
|
||||||||||||||
![]() Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 1.5.2008 Репутация: нет Всего: нет |
ты по-моему совсем запутался... Unicode - кодировка латиницы, русская кирилица вместе с ее буквами НЕ UNICODE. лично у меня русские буквы в UTF-8.
в сегменте кода - выполняющийся код, в памяти много чего лежит но к примеру:
указывает на вершину стека(хотя это можно и на асме реализовать, но теряется кроссплатформенность), но это так, для примера.
я думал старые компиляторы уникод только и знали...
Попробуй сделать так и посмотри что произойдет: #include <unistd.h> int main(int argc, char *argv[]){ write(STDOUT_FILENO, "Hello!\n", 8); return 0; }
в случае utf-8 {'H', 'e', 'l', 'l', 'o', '\n', '\0', 0, 0, 0, 0, 0, ...., 0} или {'П', 'р', 'и', 'в', 'е','т', '\n', '\0', 0, 0, 0, 0, 0, ...., 0}, иначе - зависит от кодировки.
в принципе можно передавать строку от начала до конца, без преобразований, но известив клиента о кодировке строки.
специально для не-Unicode строк. |
||||||||||||||
|
|||||||||||||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
||||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 3 Всего: 162 |
Не верно. UTF-8 - один из вариантов юникода, самый распространённый. А вообще википедия рулит. Компиляторы о юникоде не знают ровно ничего в случае не-wchar_t. Если собираешься обрабатывать юникодные строки посимвольно, используй wchar_t. Либо можешь воспользовать QString из QtCore |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 16 Всего: 196 |
Как уже заметил JackYF, компилятор ничего не знает про юникод и кодировки вообще (если, конечно, wchar_t не используется). Именно поэтому он в код пихает буквально то, что находится в кавычках. А кодировка текста в кавычках полностью зависит от кодировки исходного файла (*.cpp, например). Именно поэтому, если кодировка файла cp1251, то и в исполняемом файле весь текст будет в кодировке cp1251. |
||||
|
|||||
| Ken |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: нет Всего: 4 |
Это сообщение отредактировал(а) Ken - 18.5.2008, 08:46 |
|||
|
||||
| NAYakaSL |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 18 Регистрация: 9.5.2008 Репутация: нет Всего: нет |
Согласен, w_char_t тут рулит, вот только код когда будет такой:
Как работать с, пока еще не очень распространенной UTF16, я хз. |
|||
|
||||
| Ken |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 47 Регистрация: 31.3.2007 Репутация: нет Всего: 4 |
Для кодов символов от 0x0000 до 0xFFFF (исключая интервал 0xD800–0xDFFF - они не являются символами по стандарту) кодировка UTF16 совпадает с обычным юникодом. Символы большинство языков, в том числе и русского языка находится в этом интервале. Смотрите: http://ru.wikipedia.org/wiki/UTF-16 |
|||
|
||||
| null56 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 721 Регистрация: 19.3.2008 Репутация: 4 Всего: 12 |
За что отвечает вот эта строчка....
Объясните пожалуйста, что это за асемовский макрос или как? |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
количество единичных подряд идущих разрядов начиная со старшего -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Jorjio |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 20.5.2008 Где: г. Москва Репутация: нет Всего: нет |
Сталкивался в своё время со строками в библиотеках KDeveloper (QT1.45....2.30).
Если поможет в QT1.45 всё путем QString однобайтовый и сним можно обращатся как с любым массивом символов. в QT2.30 всё не путем QString Unicode-овый, под него в этой версии библиотеки был создан класс QChar. Т.е. в QT2.30 QString это массив QChar. Для того чтобы использовать стандартную однобайтовую строку используется класс QСString как массив char соответственно. Ну а вообще я сталкивался только с 1и2 байтовыми строками и если надо идти именно по индексу ну так в чем проблема иди по 1-му или 2 байта, смотря конечно для чего это. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 3 Всего: 162 |
На дворе уж Qt 4.4, где ты эти ископаемые нашёл? |
|||
|
||||
| Jorjio |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 20.5.2008 Где: г. Москва Репутация: нет Всего: нет |
JackYF: Да ты чё Qt 4.4
А я в QT1.45 на "Hello word"-e застрял |
|||
|
||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |