Russian Qt Forum
Июнь 16, 2024, 01:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: кодинг в utf8  (Прочитано 8040 раз)
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 не ругайте, если что ) просто я немного ошеломлен )
Записан
Вудруф
Гость
« Ответ #1 : Октябрь 12, 2006, 10:02 »

Всё логично, русские буквы в UTF-8 занимают по 2 байта. strlen подсчитывает именно количество байтов до '\0'.
Чего именно ты хочешь избежать? Переменного размера строки? Так получай её в программе и используй далее именно подсчитанное значение.
Записан
Alikus
Гость
« Ответ #2 : Октябрь 12, 2006, 10:32 »

Цитата: "Вудруф"
Так получай её в программе и используй далее именно подсчитанное значение.

Что получать и каким образом? Улыбающийся strlen?
Записан
atak
Гость
« Ответ #3 : Октябрь 12, 2006, 10:43 »

Цитата: "Alikus"
Цитата: "Вудруф"
Так получай её в программе и используй далее именно подсчитанное значение.

Что получать и каким образом? Улыбающийся strlen?

Unicode однозначно 2 байта на символ
Записан
Alikus
Гость
« Ответ #4 : Октябрь 12, 2006, 10:51 »

Я так понял выход из ситуации - кодить в кодировке koi8-r?
Записан
Вудруф
Гость
« Ответ #5 : Октябрь 12, 2006, 12:07 »

Ну например через strlen, если использовать char*...

А вообще, чего именно ты хочешь избежать?
Записан
Alikus
Гость
« Ответ #6 : Октябрь 12, 2006, 13:14 »

Я хочу избежать того, что при смене кодировки кода не приходилось менять его содержание:)
Записан
Ulysses
Гость
« Ответ #7 : Октябрь 12, 2006, 16:03 »

Может быть, написать свою strlen(), в которой возвращаемое стандартной strlen() значение делить на sizeof(char). Посмотрите также документацию по типу wchar_t - может, что найдете.

Проблемы с многобайтовыми кодировками в С++ есть вешь известная, причем, как это ни печально, нормальных переносимых решений зачастую нельзя добиться и при использовании более современных средств, чем C-style, как приведено в примере (например, такие проблемы есть у пользователей STL и Boost).
Записан
Вудруф
Гость
« Ответ #8 : Октябрь 13, 2006, 05:59 »

А в данном случае - используй std::string вместо char[], тогда не надо будет думать об ограничениях на размер строки (в известных пределах, разумеется).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.06 секунд. Запросов: 20.