Russian Qt Forum
Сентябрь 21, 2024, 20:06 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Снова про кодировку кириллицы  (Прочитано 2803 раз)
Swa
Самовар
**
Offline Offline

Сообщений: 170


Просмотр профиля
« : Октябрь 16, 2010, 17:35 »

Здравствуйте. Есть у меня несколько текстовых файлов (fb2) в разных кодировках (utf-8 и cp1251). Мне нужно, исходя из данных в этих файлах рассортировать их по каталогам. Я считываю данные, создаю каталоги. Вроде бы всё нормально, но в файловом менеджере эти каталоги сортируются не в алфавитном порядке, например, Ав..., Аб..., Аа..., Аб.... Тогда я проверяю кодировку каталога:
Код:
 find ./ -iname 'Аб*' | enca
Universal transformation format 8 bits; UTF-8
  Doubly-encoded to UTF-8 from ISO-8859-5

То есть из-за этой ISO-8859-5 они сортируются неправильно.

Код примерно такой:
Код:
QString firstName;
QString lastName;
QString title;
QByteArray temp;

bool b_firstName = false;
bool b_lastName = false;
bool b_title = false;
QString codename;
QTextCodec * codec;

while (!file.atEnd()) {
char c;
qint64 res = file.read(&c, sizeof(c));
if (res == -1) {
file.close();
error = true;
break;
}

if (c == '<') {
if (b_firstName) {
firstName = codec->toUnicode(temp);
} else if (b_lastName) {
lastName = codec->toUnicode(temp);
} else if (b_title) {
title = codec->toUnicode(temp);
}

temp.clear();
b_firstName = false;
b_lastName = false;
b_title = false;

} else if (c == '>') {
if (temp == "first-name" && firstName == "") {
b_firstName = true;
} else if (temp == "last-name" && lastName == "") {
b_lastName = true;
} else if (temp == "book-title") {
b_title = true;
} else if (temp == "/book-title") {
break;
} else if (temp.mid(0,4) == "?xml") {
int codenameindex = temp.indexOf("encoding=\"", 0);
int codenamestart = temp.indexOf("\"", codenameindex) + 1;
int codenameend = temp.indexOf("\"", codenamestart);
codename = temp.mid(codenamestart, codenameend - codenamestart);
codec = QTextCodec::codecForName(codename.toLatin1());
}
temp.clear();
} else {
temp.append(c);
}
}

if (error) {continue;}
file.close();

QString newDirName = currentDir.absolutePath().append("/").append(lastName).append(", ").append(firstName);
QDir newDir(newDirName);
if (!newDir.exists()) {
newDir.mkdir(newDirName);
}

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


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