Russian Qt Forum

Qt => Вопросы новичков => Тема начата: ___Cepera___ от Апреля 13, 2016, 10:52



Название: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: ___Cepera___ от Апреля 13, 2016, 10:52
Есть 16 байт в них помещается слово "Входной тракт". Преобразовывал строку toascii() toUtf8() и выходит 25 байт. С английскими буквами все нормально. Можно ли сделать чтобы русский символ весил 1 байт? Кодировку может нужно поменять или еще что то. Qt 4.8.7


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: Old от Апреля 13, 2016, 11:03
Есть 16 байт в них помещается слово "Входной тракт". Преобразовывал строку toascii() toUtf8() и выходит 25 байт. С английскими буквами все нормально. Можно ли сделать чтобы русский символ весил 1 байт? Кодировку может нужно поменять или еще что то. Qt 4.8.7
Конвертируйте не в utf-8, а в koi8r или cp866 (в любую 8-битную кодировку).


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: ___Cepera___ от Апреля 13, 2016, 11:57
Tolocal8bit вроде как раз, но не помогает


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: Old от Апреля 13, 2016, 13:46
Tolocal8bit вроде как раз, но не помогает
Смотрите QTextCodec.


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: __Heaven__ от Апреля 13, 2016, 13:49
А ещё в изысканную cp1251 можно :)


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: lit-uriy от Апреля 18, 2016, 09:21
"вроде как раз, но не помогает", а ты размер чего измеряешь, байтов данных или объекта QByteArray?


Название: Re: Сколько байт занимает 1 русский символ и какую использовать кодировку
Отправлено: ssoft от Апреля 18, 2016, 09:53
По вопросам применения кодеков почему-то всегда возникает много вопросов.

1) Сколько байт занимает русский символ.

В зависимости от кодировки ответ разный. Например, "cp1251" - 1 байт, в "utf-8" - 2 байта (хотя латинский - 1 байт), и т.п.

2) Как работать с текстом и правильно преобразовать в набор байт.

Существуют методы/конструкторы прямого взаимодействия QString и QByteArray - связываться с ними категорически не рекомендуется, так как результат зависит от глобально определенных параметров QTextCodec::setCodetFor...(могут быть вызваны в любое время и в любом месте) и в общем случае поведение может оказаться непредсказуемым.

Вот пара примеров кода, часто приводящих к проблемам.

Код:
...
// здесь передается внутреннее содержимое QString, а не содержащийся текст
QByteArray ba( str.constData() );
...
// используется глобальный кодек, результат может быть различный, в зависимости от предустановок
QString str( ba );
...
// используется глобальный кодек, результат может быть различный, в зависимости от предустановок
// и от используемой кодировки исходного файла
QString str( "bla bla бла" );
...

Для корректного взаимодействия необходимо всегда пользоваться кодеками QTextCodec
Лучше взять за правило - хранить исходные файлы в кодировке utf8. Можно выбрать и любую другую, типа cp1251, но utf8 более универсальна, так как содержит не только русские буквы.

Код:
QString str = QString::fromUtf8( "Входной тракт" );
str.count(); // 13 символов, но не 13 байт (минимум 25, а может и больше)

QTextCodec * cp1251 = QTextCodec::codecForName( "cp1251" );
QByteArray ba = cp1251->fromUnicode( str );
ba.count(); // 13 символов, 13 байт в кодировке cp1251.

...

// обратное преобразование
str = cp1251->toUnicode( ba );

...