Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посимвольный проход по UTF-8 строке 
:(
    Опции темы
bsa
Дата 5.5.2008, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Цитата(georain @ 1.5.2008,  00:08)
Объясните пожалуйста.

Вот я написал:
Код

char * str = "Русский текст, возможно в каком-то Unicode, но я не знаю";

Что лежит в коде или в памяти программы?

Как уже заметил JackYF, компилятор ничего не знает про юникод и кодировки вообще (если, конечно, wchar_t не используется). Именно поэтому он в код пихает буквально то, что находится в кавычках. А кодировка текста в кавычках полностью зависит от кодировки исходного файла (*.cpp, например). Именно поэтому, если кодировка файла cp1251, то и в исполняемом файле весь текст будет в кодировке cp1251.
PM   Вверх
Ken
Дата 11.5.2008, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: нет
Всего: 4



Код

std::wstring fromUtf8 (const char *str)
{
    std::wstring result;
    int bytes = 0;
    int code;

    while (true)
    {
        int ch = static_cast <unsigned char> (*str++);
        if (ch == 0)
            break;
        // Первый байт последовательности?
        if (bytes == 0)
        {
            // Вычисляем количество байтов для текущего символа
            // т.е. количество 1 в старших битах
            while (true)
            {
                ch <<= 1;
                if (ch < 256) break;
                ch &= 0xff;
                ++bytes;
            }
            // bytes содержит количество байтов
            // Восстанавливаем первый байт без служебных единиц в старших битах
            code = ch >> (bytes + 1);
        }
        else
        {
            // Учитываем след. байт в unicode
            code = (code << 6) + (ch & 0x3f);
        }

        if (bytes > 0)
            --bytes;
        // Все коды учтены?
        if (bytes == 0)
            // Добавляем символ к строке
            result += code;
    }
    return result;
}


Это сообщение отредактировал(а) Ken - 18.5.2008, 08:46
PM MAIL   Вверх
NAYakaSL
Дата 12.5.2008, 04:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 9.5.2008

Репутация: нет
Всего: нет



Согласен, w_char_t тут рулит, вот только код когда будет такой:
Код

w_char_t *st = L"А вот здесь уже свободно может располагаться строка с символами, что кодируются 2мя байтами, т.е. UTF8";


Как работать с, пока еще не очень распространенной UTF16, я хз. smile
PM MAIL   Вверх
Ken
Дата 12.5.2008, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 31.3.2007

Репутация: нет
Всего: 4



Цитата(NAYakaSL @ 12.5.2008,  04:49)
Как работать с, пока еще не очень распространенной UTF16, я хз. smile

Для кодов символов от 0x0000 до 0xFFFF (исключая интервал 0xD800–0xDFFF - они не являются символами по стандарту) кодировка UTF16 совпадает с обычным юникодом. Символы большинство языков, в том числе и русского языка находится в этом интервале. Смотрите:

http://ru.wikipedia.org/wiki/UTF-16

PM MAIL   Вверх
null56
Дата 14.5.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 4
Всего: 12



За что отвечает вот эта строчка....
Код

 __asm__("1: shlb $1, %1\nincb %0\njc 1b" : "=r" (bits) : "r" (*str), "0" (0));


Объясните пожалуйста, что это за асемовский макрос или как?
PM MAIL   Вверх
MAKCim
Дата 15.5.2008, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



Цитата(null56 @  14.5.2008,  21:24 Найти цитируемый пост)
Объясните пожалуйста, что это за асемовский макрос или как? 

количество единичных подряд идущих разрядов начиная со старшего


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Jorjio
Дата 24.5.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 байта, смотря конечно для чего это.

PM MAIL ICQ Skype   Вверх
JackYF
Дата 25.5.2008, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(Jorjio @  24.5.2008,  19:21 Найти цитируемый пост)
QT1.45

Цитата(Jorjio @  24.5.2008,  19:21 Найти цитируемый пост)
QT2.30

На дворе уж Qt 4.4, где ты эти ископаемые нашёл? smile



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Jorjio
Дата 25.5.2008, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 20.5.2008
Где: г. Москва

Репутация: нет
Всего: нет



JackYF: Да ты чё Qt 4.4 smile . Вот это скорость.

А я в QT1.45 на "Hello word"-e застрял smile 
PM MAIL ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0861 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.