2013-05-31 2 views
2

Есть ли какая-либо нативная (кроссплатформенная) функция C++ в любой из стандартных библиотек, которая возвращает фактическую длину std::string?C++ UTF-8 фактическая длина строки

Update: , как мы знаем, std::string.length() возвращает число байтов, а не число символов. У меня уже есть пользовательская функция, которая возвращает фактическую, но я ищу стандартный.

+0

Вы можете найти интересные ответы [здесь ] (http://stackoverflow.com/questions/4063146/getting-the-actual-length-of-a-utf-8-encoded-stdstring). Обратите внимание, однако, что, как @BenVoigt указал на это, C++ 11 теперь имеет стандартные способы его достижения. – syam

+0

@syam: Согласен, но ответ изменился за последние 3 года. Кроме того, в этом вопросе конкретно задаются функции, предоставляемые Стандартом, а не пользовательская реализация, и это все, что вы найдете в ответах на другой вопрос. –

+0

@BenVoigt: Я только что видел ваш ответ, не знал, что это часть C++ 11. Тем не менее, ответы на этот другой вопрос могут быть интересными, я просто переработаю свой комментарий. – syam

ответ

4

codecvt Должен быть полезным, в стандарте предусмотрены реализации для UTF-8, например codecvt_utf8<char32_t>().

Вероятно, что-то вроде:

wstring_convert< codecvt_utf8<char32_t>, char32_t >().from_bytes(the_std_string).size() 
1

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

Подробнее о различном роде длина строки в http://utf8everywhere.org

0

Там нет никакого способа сделать это в C/C++, без библиотек 3 участника. Даже если вы перейдете на char32_t, вы получите коды, а не символы.

Кодовая точка не соответствует пользовательскому восприятию персонажа из-за таких вещей, как декомпозиционные форматы, лигатуры, вариаторы.

Ближайший доступный конструкт к «пользовательским символом» является «графема кластера» (см http://www.unicode.org/reports/tr29/)

Ваш лучший вариант кросс-платформа ICU4C (http://site.icu-project.org/)