Удобные UTF-8 строки?
От: Neavirc  
Дата: 17.04.08 09:14
Оценка:
Проблема в следующем: очень хочется работать с libmysqlclient, используя utf8-строки для обработки результатов SQL-запроса.

В ответ на SQL-запрос libmysqlclient (предварительно специальным образом пнутый) возвращает utf8-строку в обычном const char* (т.е. один символ в таком массиве может быть представлен несколькими байтами). Такую строку можно вывести в cout, можно даже создать из нее std::string, но вот удобно с такой строкой работать уже нельзя (нельзя, например, вытащить произвольный символ обычным оператором [] и сравнить с символьным литералом).

Поэтому я написал простенький конвертер (потом правда узнал про мега-штуку iconv, но конвертер был уже написан) из utf8 в ucs2 составляющий std::wstring. Но терзают меня смутные сомнения, что есть способ удобно работать с utf8 строками не конвертируя их в ucs2.

Вопросы:

1. Решение с конвертацией utf8 в ucs2 с целью использовать wstring (а потом обратно) — оно вообще нормальное? Мне не нравится.
2. Есть ли возможность используя только стандартную библиотеку удобно работать с utf8-строками?
3. Есть ли utf8 строки в Boost? Очень хочется поработать с boost, но в онлайн документации ничего подходящего не нашел. А повод, чтобы начать был бы хороший.
Re: Удобные UTF-8 строки?
От: _vvs Россия  
Дата: 17.04.08 10:23
Оценка:
Здравствуйте, Neavirc, Вы писали:

N>Поэтому я написал простенький конвертер (потом правда узнал про мега-штуку iconv, но конвертер был уже написан) из utf8 в ucs2 составляющий


Немного не по теме
Есть ещё хорошая библиотека ICU от IBM. Она позволяет сделать тоже, что и iconv. Конвертирует символы из одной кодировки в другую
Может быть вам это будет интересным!?
Re: Удобные UTF-8 строки?
От: Dj.ValDen Украина http://ua.linkedin.com/in/dvalchuk
Дата: 17.04.08 11:10
Оценка: 28 (3)
Здравствуйте, Neavirc, Вы писали:

N>Проблема в следующем: очень хочется работать с libmysqlclient, используя utf8-строки для обработки результатов SQL-запроса.


N>В ответ на SQL-запрос libmysqlclient (предварительно специальным образом пнутый) возвращает utf8-строку в обычном const char* (т.е. один символ в таком массиве может быть представлен несколькими байтами). Такую строку можно вывести в cout, можно даже создать из нее std::string, но вот удобно с такой строкой работать уже нельзя (нельзя, например, вытащить произвольный символ обычным оператором [] и сравнить с символьным литералом).


N>Поэтому я написал простенький конвертер (потом правда узнал про мега-штуку iconv, но конвертер был уже написан) из utf8 в ucs2 составляющий std::wstring. Но терзают меня смутные сомнения, что есть способ удобно работать с utf8 строками не конвертируя их в ucs2.


N>Вопросы:


N>1. Решение с конвертацией utf8 в ucs2 с целью использовать wstring (а потом обратно) — оно вообще нормальное? Мне не нравится.

N>2. Есть ли возможность используя только стандартную библиотеку удобно работать с utf8-строками?
N>3. Есть ли utf8 строки в Boost? Очень хочется поработать с boost, но в онлайн документации ничего подходящего не нашел. А повод, чтобы начать был бы хороший.


UTF8-CPP: UTF-8 with C++ in a Portable Way
С уважением Denys Valchuk

IMHO чем больше мнений тем оптимальней выбор варианта... :)
Re: Удобные UTF-8 строки?
От: . Великобритания  
Дата: 17.04.08 11:39
Оценка:
Neavirc wrote:

> удобно с такой строкой работать уже нельзя (нельзя, например, вытащить

> произвольный символ обычным оператором [] и сравнить с символьным
> литералом).
А это в принципе нельзя. Точнее можно, но с линейной сложностью.
Этот цикл
for(int i=0; i<utf8String.size(); ++i)
{
  if(utf8String[i] == ....)...
}

скажем, на строке длиной 10000 символов будет совершать 100млн операций. Ты действительно этого хочешь?
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Удобные UTF-8 строки?
От: Cyberax Марс  
Дата: 17.04.08 21:24
Оценка: +1
Здравствуйте, ., Вы писали:

.>А это в принципе нельзя. Точнее можно, но с линейной сложностью.

Ну... Если очень хочется — то можно заранее построить индексы.
Sapienti sat!
Re[3]: Удобные UTF-8 строки?
От: . Великобритания  
Дата: 18.04.08 08:55
Оценка:
Cyberax wrote:

> .>А это в принципе нельзя. Точнее можно, но с линейной сложностью.

> Ну... Если очень хочется — то можно заранее построить индексы.
Уж проще в ucs перевести. И интуитивно кажется, что будет быстрее.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Удобные UTF-8 строки?
От: sraider http://dvinogradov.blogspot.com
Дата: 20.04.08 17:41
Оценка:
.>>А это в принципе нельзя. Точнее можно, но с линейной сложностью.
C>Ну... Если очень хочется — то можно заранее построить индексы.

Да forward iterator-а хватит за глаза. Такого, чтобы тип выражения *it был wchar_t или uint32, а ++it переходил бы на следующий символ.
Re[4]: Удобные UTF-8 строки?
От: Mr.Cat  
Дата: 20.04.08 18:41
Оценка:
Здравствуйте, ., Вы писали:
.>Уж проще в ucs перевести. И интуитивно кажется, что будет быстрее.

Тогда уж в utf-32 (или как его там правильно — UCS-4?). Иначе рано или поздно какие-нить символы потерять можно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.