![]() |
Модераторы: 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. |