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

Поиск:

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


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


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

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



Цитата(Proger10 @  1.6.2013,  22:01 Найти цитируемый пост)
 Теперь реализую класс собственной строки, где все основные операции и опишу, их не так много) доступ к произвольному символу, поиск в строке, да сортировка букв. Представлю эту "строку" в виде массива таких однобайтовых/двухбайтовых символов - да и делов-то


ну так wstring уже есть smile

Добавлено через 1 минуту и 9 секунд
на крайней случай есть еше std::basic_string

Добавлено через 4 минуты и 49 секунд
Цитата(Proger10 @  2.6.2013,  02:43 Найти цитируемый пост)
Работает  в str5 как раз буква "а". Класс   "Спасибо, теперь я программист!" 

если делаете для опыта, то посмотрите как решено в уже упомянутой utfcpp,
а если для дела, то лучше отказаться от велосипеда, тем более при таком уровне вопросов..

Добавлено через 7 минут и 53 секунды
Цитата(Proger10 @  31.5.2013,  20:48 Найти цитируемый пост)
Почему мне необходимы как можно максимально-стандартизированное решение, так потому, что я не уверен, что внешняя библиотека сможет скомпилиться на тех жутких платформах, на которых я буду собирать проект с этой библиотекой. 

а за свой код Вы уверенны, что он скомпилируется ? а если сторонняя библиотечка маленькая и аккуратная в ней к томуже можно легко поправить, как и в своем коде.. 



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


Опытный
**


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

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



mes
Цитата
ну так wstring уже есть smile

По идее, да, но чего же класс-то таким разным получился, что на разных операционных системах представляется по-разному? С wstring ещё больше гемора, чем с UTFфным std::string smile Мне легче работать с текстом как с цифрами UTF-8, нежели бегать за багами wstring'а - где там на какой платформе он как ещё представится, постоянно отлаживать, анализировать, а тут наверняка знаешь, что у тебя там за данные UTF-16 или UTF-8, UTF-32... Да и в случае с std::string и деться некуда - UTF-8 и std::string - так и сдампиться в файл как обычно. На UTF-8 у меня уже лет 8-10 операционки работают, при программировани только с ними дело имел (в крайнем случае unix iconv'ом приводил все файлы к ней), поэтому эта кодировка не нова мне, но копаться в её внутренностях только сейчас пришлось smile

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


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


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

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



Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
, что на разных операционных системах представляется по-разному?

проблема не в wstring, а в базовом wchar`е.. используйте basic_string с нужным типом кирпича для вашей стены.. 

Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
 С wstring ещё больше гемора, чем с UTFфным std::string 

Вы сейчас сравниваете теплое с мягким... (w)string это всего лишь контейнер для хранения. 
А utf-8 это формат хранения текста в контейнере..  Недостаток utf-8 в переменной длине символа и в этом же  ее преимушество. При этом хранить его можно как в string так и в wstring. Только при хранении в однобайтовом контейнере границы символа. В многобайтовой же строке для каждого символа есть свое место. Естественно при переносе текста между форматами хранения нужен конвертер.

Добавлено через 5 минут и 1 секунду
Цитата(Proger10 @  2.6.2013,  13:02 Найти цитируемый пост)
 Мне легче работать с текстом как с цифрами UTF-8, нежели бегать за багами wstring'а -

опять же высказывание показывает непонимание происходящего и подмена обстоятельств..


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


Упертый сишник
*


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

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



Цитата(Proger10 @  31.5.2013,  18:26 Найти цитируемый пост)
setlocale(LC_ALL,"")

работает в windows. И всегда работало...
PM MAIL   Вверх
bsa
Дата 3.6.2013, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Proger10, кончай заниматься велосипедоизобретательством. Есть такая вещь в С++ называется locale. У всех потоков есть getloc и imbue, которые позволяют задать локаль. С ее помощью, можно сделать автоматическую конвертацию читаемые/записываемых данных между UTF-8 и wstring. Под линуксом это работает без проблем.
PM   Вверх
borisbn
Дата 12.6.2013, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(volatile @  2.6.2013,  11:11 Найти цитируемый пост)
попробуйте для начала написать хотябы
operator [], для вашего класса строки.


а затем функцию length(), возвращающую количество символов (не байт) в строке
 smile 

Это сообщение отредактировал(а) borisbn - 12.6.2013, 10:41


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
volatile
Дата 12.6.2013, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



borisbn, ну кол-во символов теоретически можно написать, 
а вот оператор [], написать нельзя, даже теоретически.
Код

s = "abc";
s [1] = 'Б';
//здесь s должно быть равно "aБc"

 smile

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


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


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


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

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



Цитата(volatile @  12.6.2013,  11:26 Найти цитируемый пост)
а вот оператор [], написать нельзя, даже теоретически.

можно, если этот оператор будет оперировать не байтом  smile 


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


Эксперт
****


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

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



Цитата(mes @  12.6.2013,  21:26 Найти цитируемый пост)
можно, если этот оператор будет оперировать не байтом
причем сложность будет линейная.
PM   Вверх
volatile
Дата 12.6.2013, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(mes @  12.6.2013,  20:26 Найти цитируемый пост)
можно, если этот оператор будет оперировать не байтом    

Естественно если писать wstring, то можно.
Но там по условию ТС хранит UTF8 строку. 
оператор[] должен вернуть неконстантую ссылку, на символ из этой строки.

хорошо, скажем мягче. я не знаю как писать такой оператор.
smile

Добавлено через 12 минут и 29 секунд
Разве что с привлечение каких-то временных объектов...
и постоянным конвертированием UTF8<->UTF16/32.
но заставить такое глюкало корректно работать во  всех режимах, врядли получицца...

PM MAIL   Вверх
mes
Дата 15.6.2013, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
оператор[] должен вернуть неконстантую ссылку, на символ из этой строки.

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
Разве что с привлечение каких-то временных объектов...

ага, возвращением прокси объекта

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
я не знаю как писать такой оператор.

как будет свободное время напишу примерчик

Цитата(volatile @  12.6.2013,  22:29 Найти цитируемый пост)
и постоянным конвертированием UTF8<->UTF16/32.

 smile 
НИ о какой конвертации кодировок тут речи нет !  smile 

возможно из за путаницы понятий, подразумевается  конвертация в многобайтовый контейнер ? да для внутреннего пользования можно и так хранить..
а можно динамично искать ну#ный порядковый номер, но тогда 
Цитата(bsa @  12.6.2013,  20:57 Найти цитируемый пост)
сложность будет линейная. 

а в первом варианте нет.. 



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


Эксперт
****


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

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



Цитата(mes @  15.6.2013,  13:32 Найти цитируемый пост)
НИ о какой конвертации кодировок тут речи нет !
возможно из за путаницы понятий, подразумевается  конвертация в многобайтовый контейнер 

Не из-за путаницы понятий  smile , а просто чтобы покороче написать.
Да именно это я и имел ввиду.

Цитата(mes @  15.6.2013,  13:32 Найти цитируемый пост)
как будет свободное время напишу примерчик

mes, примерчик-то написать можно. Сложность там будет в том чтобы 
Цитата(volatile @  12.6.2013,  23:29 Найти цитируемый пост)
заставить такое глюкало корректно работать во  всех режимах,

А заставлять вас писать полный вариант - мне абсолютно не удобно.
Работа большая и очень не благодарная.


Это сообщение отредактировал(а) volatile - 16.6.2013, 00:21
PM MAIL   Вверх
mes
Дата 23.6.2013, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(volatile @  15.6.2013,  23:16 Найти цитируемый пост)
Сложность там будет в том чтобы 


Цитата(volatile @  15.6.2013,  23:16 Найти цитируемый пост)
заставить такое глюкало корректно работать во  всех режимах,

позвольте узнать в чем глюкало ? разбить строку на символы ?! 



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


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


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

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



Цитата(mes @  15.6.2013,  12:32 Найти цитируемый пост)

Цитата

можно, если этот оператор будет оперировать не байтом

Цитата

я не знаю как писать такой оператор.

как будет свободное время напишу примерчик


чего то хорошей идеи для примера не пришло, вот накалякал пример прокси на скорую руку :

Код

#include <iostream>

struct proxy
{
  proxy(int * pos) : _pos(pos){}

  operator int () { return *_pos; }
  void operator=(int value) 
  {
    *_pos=value;
  } 

  int * _pos; 
};


struct mystring : std::string
{

  mystring(const char * s) : std::string(s) {}
  proxy operator[](size_t idx)
  {
    return proxy((int*)&at(idx));
  }
};

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

  std::cout << s <<std::endl;

  s[3] = *((int*)"LO W");

  std::cout << s <<std::endl;
}



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


Эксперт
****


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

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



> proxy((int*)&at(idx));
С русскими буквами в utf-8 работать не будет. Вернее, поведение будет отличаться от предполагаемого.
Например, я бы хотел, чтобы в строке "привет мир" символ с индексом 3 был бы 'в'


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

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

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

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

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


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

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


 




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


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

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