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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сколько байт занимает 1 русский символ и какую использовать кодировку  (Прочитано 10080 раз)
___Cepera___
Гость
« : Апрель 13, 2016, 10:52 »

Есть 16 байт в них помещается слово "Входной тракт". Преобразовывал строку toascii() toUtf8() и выходит 25 байт. С английскими буквами все нормально. Можно ли сделать чтобы русский символ весил 1 байт? Кодировку может нужно поменять или еще что то. Qt 4.8.7
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Апрель 13, 2016, 11:03 »

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

Tolocal8bit вроде как раз, но не помогает
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Апрель 13, 2016, 13:46 »

Tolocal8bit вроде как раз, но не помогает
Смотрите QTextCodec.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Апрель 13, 2016, 13:49 »

А ещё в изысканную cp1251 можно Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #5 : Апрель 18, 2016, 09:21 »

"вроде как раз, но не помогает", а ты размер чего измеряешь, байтов данных или объекта QByteArray?
Записан

Юра.
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #6 : Апрель 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 );

...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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