Название: кодинг в utf8 Отправлено: Alikus от Октябрь 12, 2006, 06:54 Раньше всегда программировал в кодировке koi8-r и не сталкивался с подобным.
В общем проблема в следующем. Есть некий код в кодировке koi8: Код: #include <stdio.h> Вывод вполне логичный и правильный. Цитировать strlen='6' Но стоит только перевести этот код в кодировку utf8 (с помощью всем известной утилиты iconv), то вывод: Цитировать strlen='12' Мне хотелось бы услышать рекомендаци по тому как именно программировать, что бы таких ситуаций не возникало. Просто приходится часто менять локаль (то koi8-r, то utf8), как это учитывать или как это избежать? Или придется писать в koi8-r? PS не ругайте, если что ) просто я немного ошеломлен ) Название: кодинг в utf8 Отправлено: Вудруф от Октябрь 12, 2006, 10:02 Всё логично, русские буквы в UTF-8 занимают по 2 байта. strlen подсчитывает именно количество байтов до '\0'.
Чего именно ты хочешь избежать? Переменного размера строки? Так получай её в программе и используй далее именно подсчитанное значение. Название: кодинг в utf8 Отправлено: Alikus от Октябрь 12, 2006, 10:32 Цитата: "Вудруф" Так получай её в программе и используй далее именно подсчитанное значение. Что получать и каким образом? :) strlen? Название: кодинг в utf8 Отправлено: atak от Октябрь 12, 2006, 10:43 Цитата: "Alikus" Цитата: "Вудруф" Так получай её в программе и используй далее именно подсчитанное значение. Что получать и каким образом? :) strlen? Unicode однозначно 2 байта на символ Название: кодинг в utf8 Отправлено: Alikus от Октябрь 12, 2006, 10:51 Я так понял выход из ситуации - кодить в кодировке koi8-r?
Название: кодинг в utf8 Отправлено: Вудруф от Октябрь 12, 2006, 12:07 Ну например через strlen, если использовать char*...
А вообще, чего именно ты хочешь избежать? Название: кодинг в utf8 Отправлено: Alikus от Октябрь 12, 2006, 13:14 Я хочу избежать того, что при смене кодировки кода не приходилось менять его содержание:)
Название: кодинг в utf8 Отправлено: Ulysses от Октябрь 12, 2006, 16:03 Может быть, написать свою strlen(), в которой возвращаемое стандартной strlen() значение делить на sizeof(char). Посмотрите также документацию по типу wchar_t - может, что найдете.
Проблемы с многобайтовыми кодировками в С++ есть вешь известная, причем, как это ни печально, нормальных переносимых решений зачастую нельзя добиться и при использовании более современных средств, чем C-style, как приведено в примере (например, такие проблемы есть у пользователей STL (http://www.codeproject.com/vcpp/stl/upgradingstlappstounicode.asp) и Boost). Название: кодинг в utf8 Отправлено: Вудруф от Октябрь 13, 2006, 05:59 А в данном случае - используй std::string вместо char[], тогда не надо будет думать об ограничениях на размер строки (в известных пределах, разумеется).
|