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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение длины строки std::string на русском 
:(
    Опции темы
Proger10
Дата 1.6.2013, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mes
Спасибо! Только не очень понял код smile Как мне кажется, там трёхбайтовых вообще нет в данной строке, это верно?
Судя по количеству байт:
Цитата
14:31:01 codepages $ cat 1.txt
hallo привет
14:35:08 codepages $ cat 1.txt | xxd -b
0000000: 01101000 01100001 01101100 01101100 01101111 00100000  hallo 
0000006: 11010000 10111111 11010001 10000000 11010000 10111000  ......
000000c: 11010000 10110010 11010000 10110101 11010001 10000010  ......

14:35:10 codepages $ 


Не очень понял по Вашему коду, что обозначает число 0x07? Понял, что 0x7F - это проверка условия на значение большее, чем 127, но 0х07 - это, вроде бы, 7 в десятичной? А зачем эта проверка делается? Такое чего-то я нигде не читал(

В целом смысл кода понятен, но откуда вот это число взялось непонятно. Кстати, я бы там в цикле не size(), а ( size() - 1 ) ставил бы, поскольку идёт выход за границу для s[ i + 1 ].

С substr - классный подход вообще получился! Спасибо! smile

Добавлено через 10 минут и 47 секунд
Не очень вообще понимаю как узнать в UTF-8 сколька байтный символ сейчас перед нами. Смотрю в таблицу:
http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec

я разложил там по 10-тичным значениям для удоства. smile Наши символы представлены двухбайтными, например: 208 144, 208 149 и т.д. Всё верно. Но трёхбайтные представлены, в принципе аналогично:

http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec

т.е.: 224 176 130, 224 176 134. Как их отличить-то? Все числа одновременно больше 127... Мне подумалось, может логика такая, что если очередное число больше 127, то следующее число добавляем в текущее... но нет ведь!

Добавлено через 14 минут и 26 секунд
Аа, вот оно что. Оказывается та инфа о диапазонах указывала на порядковый номер символа в ЮТФ кодировке. Ок:
http://www.utf8-chartable.de/unicode-utf8-...24&utf8=dec
т.е. начинающиеся с номера 2048, действительно, идут 3х-байтовыми. Но блин, как узнать какой у символа порядковый номер в ЮТФе? smile Перед нами же вообще числа!) Я, понимаю, что мне такие буквы не нужны, но всё-таки интересно! smile Уж если изучать тему, так изучать!  smile 
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Не очень понял по Вашему коду, что обозначает число 0x07? Понял, что 0x7F - это проверка условия на значение большее, чем 127, но 0х07 - это, вроде бы, 7 в десятичной? А зачем эта проверка делается? Такое чего-то я нигде не читал(


Цитата(Proger10 @  1.6.2013,  01:29 Найти цитируемый пост)
Unicode UTF-8:
0x00000000 — 0x000000[7F]: 0xxxxxxx
0x00000080 — 0x0000[07]FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx


Добавлено @ 14:32
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
. Кстати, я бы там в цикле не size(), а ( size() - 1 ) ставил бы, поскольку идёт выход за границу для s[ i + 1 ].

там было else забыто.. (поправил).. а насчет границ, так под напильник же )


Это сообщение отредактировал(а) mes - 1.6.2013, 14:39


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Упс, всё равно не пойму, что именно Вы выделили полужирным smile Т.е. вот это число: 0x000007FF равно вот этому: 0x07 в Вашем коде? Или по какой логике там сравнение с 0х07, не пойму smile
Вроде 0x000007FF в десятичной это: 2047, а 0х07 это 7 smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
я разложил там по 10-тичным значениям для удоства.

лучше в шестнадцатиричной.. меньше путаницы будет.. 

Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Не очень вообще понимаю как узнать в UTF-8 сколька байтный символ сейчас перед нами. 

утф8 так устроена, что по текущему значению можно узнать есть ли хвост.. смотрите пример..


--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 1.6.2013, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



А что уже std::wstring str = L"123абв"; уже отменили ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Proger10 @  1.6.2013,  13:36 Найти цитируемый пост)
Или по какой логике там сравнение с 0х07, не пойму

там пример на скорую руку на скорую руку.. без анализа таблицы... оставил для Вас ))

Добавлено через 1 минуту и 7 секунд
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
т.е. начинающиеся с номера 2048, действительно, идут 3х-байтовыми.

ага примерно так )


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Разве что я вижу такую зависимость в терминах десятичного счисления: если первое число больше 223, то отсюда начинаются уже трёхбайтные значения. Соответственно, нужно просто прочесать все такие диапазоны и поставить строгие условия, типа: если первый символ больше n, но меньше m, то соответственно он составляет столько-то байт.

Добавлено через 2 минуты и 47 секунд
mes 
АА, понятно. Спасибо за ответ! Тем не менее, порыв таблицу, вроде я сориентировался уже. Спасибо Вам за помощь! Вы мне очень помогли! Плюсанул в репутацию smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Proger10 @  1.6.2013,  13:42 Найти цитируемый пост)
Соответственно, нужно просто прочесать все такие диапазоны и поставить строгие условия, типа: если первый символ больше n,

так и делается в примере..

Добавлено через 4 минуты и 50 секунд
Цитата(Proger10 @  1.6.2013,  12:39 Найти цитируемый пост)
Но блин, как узнать какой у символа порядковый номер в ЮТФе?

если вычесть диапазон, к которому принадлежит символ, то останется смещение символа в таблице для этого диапазона.. итого 4 таблицы разной длины (по длине диапазона)



--------------------
PM MAIL WWW   Вверх
Dem_max
Дата 1.6.2013, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



ТС почитай тут
http://ru.wikipedia.org/wiki/UTF-8


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
volatile
Дата 1.6.2013, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



ну ну, искатели приключений ...
smile
PM MAIL   Вверх
mes
Дата 1.6.2013, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(volatile @  1.6.2013,  17:23 Найти цитируемый пост)
ну ну, искатели приключений ...

 smile 
Proger10, http://sourceforge.net/projects/utfcpp/


--------------------
PM MAIL WWW   Вверх
Proger10
Дата 1.6.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @ 1.6.2013,  22:04)
Цитата(volatile @  1.6.2013,  17:23 Найти цитируемый пост)
ну ну, искатели приключений ...

 smile 
Proger10, http://sourceforge.net/projects/utfcpp/

Это я видел вчера) но тоже по-моему многова-то кода для такой, как я понял уже, простой задачи smile Теперь реализую класс собственной строки, где все основные операции и опишу, их не так много) доступ к произвольному символу, поиск в строке, да сортировка букв. Представлю эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то smile

Добавлено через 36 секунд
Цитата(volatile @ 1.6.2013,  18:23)
ну ну, искатели приключений ...
smile

А почему? Вроде всё же разрешилось легко? smile

Добавлено через 6 минут и 56 секунд
Кстати, вот единственное, что осталось ещё непонятым в UTF-8, так это вот это указание:
Цитата
Несмотря на то, что UTF-8 позволяет указать один и тот же символ несколькими способами, только наиболее короткий из них правильный. Остальные формы должны отвергаться по соображениям безопасности.


это о каком одном и том же символе речь идёт? Если например символ выглядит одинаково во многих языках, выбрать надо тот, порядковый номер, которого, короче? Так что ли? smile Вроде в русском и английском таких нет или речь как раз про: а, с, о, которые на обоих языках одинаковы? Вроде проверил в блокноте (MacOS, Coda + UTF-8) - да не заменяются никакие символы никакими младшими... заменяются теми, что и в Юникод-таблице.. о чём там речь - ума не приложу smile
PM MAIL   Вверх
volatile
Дата 1.6.2013, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
А почему? Вроде всё же разрешилось легко?

Что разрешилось то?

Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
Теперь реализую класс собственной строки, где все основные операции и опишу

Цитата(Proger10 @  1.6.2013,  23:01 Найти цитируемый пост)
эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то 

угу. еще свой СТЛ напишите, делов то...
Команду тестеров нанять не забудьте только, по отлову багов...

PM MAIL   Вверх
Proger10
Дата 2.6.2013, 03:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



volatile
Ну вроде задачу более-менее понял, попробую реализовать, а там посмотрю, может и правда гемор будет огромный, но пока вроде ничего беды не предвещает smile

Правда у меня сейчас большая проблема в основах C++))) Я не знаю как мне в std::string вообще закидывать эти UTF-8 коды =) Не подскажете? =) Задача такая: знаю десятичные коды (да и любые удобные для системы), если десятичные то последовательность двух: "208 176" - это последовательность буквы "а". А вот как эту последовательность мне записать в std::string переменную? smile С какими типами данных здесь мне нужно поработать?)

Добавлено @ 03:51
Хотя... полагаю, так? 

Код
    std::string str5 = "";
    str5.append( 1, 208 );
    str5.append( 1, 176 );

// или даже так: 
    str5 += 208;
    str5 += 176;


Работает smile в str5 как раз буква "а". Класс  smile "Спасибо, теперь я программист!"  smile 

Это сообщение отредактировал(а) Proger10 - 2.6.2013, 04:18
PM MAIL   Вверх
volatile
Дата 2.6.2013, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

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



Цитата(Proger10 @  2.6.2013,  03:43 Найти цитируемый пост)
но пока вроде ничего беды не предвещает 

Proger10, попробуйте для начала написать хотябы
operator [], для вашего класса строки.  smile 



PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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