Russian Qt Forum

Программирование => С/C++ => Тема начата: Alikus от Октябрь 12, 2006, 06:54



Название: кодинг в utf8
Отправлено: Alikus от Октябрь 12, 2006, 06:54
Раньше всегда программировал в кодировке koi8-r и не сталкивался с подобным.
В общем проблема в следующем. Есть некий код в кодировке koi8:
Код:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    char s[20], str[20];
    strcpy(s,"Привет");
    sprintf(str,"strlen='%d'\n",strlen(s));
    printf(str);
    return 0;
}

Вывод вполне логичный и правильный.
Цитировать
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[], тогда не надо будет думать об ограничениях на размер строки (в известных пределах, разумеется).