По вопросам применения кодеков почему-то всегда возникает много вопросов.
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 );
...