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

Поиск:

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


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


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

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



Цитата(borisbn @  23.6.2013,  15:05 Найти цитируемый пост)
С русскими буквами в utf-8 работать не будет

нда..  smile .. это был не пример работы с русскими буквами.. а пример оператора[] возвращающего не сырую ссылку, а некую прокси, в которой можно имплементировать подходящую логику..
эх.. чувствую придется писать полноценный пример, не смотря на лень  smile

Добавлено @ 17:49
для начала все ж 
Цитата(borisbn @  23.6.2013,  15:05 Найти цитируемый пост)
proxy((int*)&at(idx));
С русскими буквами в utf-8 работать не будет.

а если вместо 
Цитата(mes @  23.6.2013,  14:05 Найти цитируемый пост)
 *_pos=value; 

replace_utf_char(_pos, value)

ну и соотвественно  вместо 

Цитата(mes @  23.6.2013,  14:05 Найти цитируемый пост)
(int*)&at(idx)

utf_index(idx)
?

Это сообщение отредактировал(а) mes - 23.6.2013, 17:49


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


Эксперт
****


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

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



Цитата(mes @  23.6.2013,  17:41 Найти цитируемый пост)
 это был не пример работы с русскими буквами.. 

mes, ну оно пока, даже и с английскими не работает:
Код

int main ()
{
  mystring s= "hello world";

  std::cout << s <<std::endl;
  s[0] = 'H'; // Меняем первую букву.
  std::cout << s <<std::endl;
}


Код

hello world
H   o world


такое вообще не компилируецца:
Код

s[0] = s[4] = c;

а если подредактировать проксю, чтобы возвращал себя, то компилировацца таки будет, но работать будет не правильно. smile 

короче, неблагодарное это дело.... 
PM MAIL   Вверх
zevs5
Дата 22.9.2016, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mes @ 1.6.2013,  12:17)
Цитата(Proger10 @  1.6.2013,  01:29 Найти цитируемый пост)
Как же здесь быть? По-моему что-то я уже напутал и относительно диапазонов UTF-8 там что-то другое имелось ввиду..) По чему же мы определяем вхождения в те диапазоны UTF-8, по очередному символу или по чему-то другому?

под напильник (для длины из 3х символов)
Код

#include <iostream>

int main()
{
  std::string s = "hallo привет";
  
  for (size_t i=0; i<s.size(); )
  {
    size_t ln=0;

    if ((unsigned char)(s[i])>0x7F) ++ln;
    else
    if ((unsigned char)(s[i+1])>0x07) ++ln;
    else  ++ln;

    std::cout << s.substr(i, ln) << std::endl; 

    i+=ln;
 }
}


Добавлено @ 12:17
Цитата

h
a
l
l
o
 
п
р
и
в
е
т

Спасибо за подсказку, три дня лазил по интернету и ничего не находил, а тут наткнулся и ниточка появилась.
Еще раз спасибо.
PM MAIL   Вверх
bsa
Дата 26.9.2016, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



zevs5, это не совсем корректный пример. С кириллицей и латиницей он работать конечно будет, но если там будут иероглифы, то работать перестанет. Самый правильный способ - все операции с "буквами" и "символами" производить на строках из wchar_t.
Код
#include <wchar.h>

wchar_t *dest = malloc(...);
...
mbstate_t state;
mbsinit(&state);
size_t numSymb = mbrtowc(dest, src, src_len, &state);

описание wchar.h
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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