Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перекодировка UTF-8 в KOI8-R, Как правильно выполнять перекодирование  
V
    Опции темы
svlary
Дата 8.1.2011, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: нет
Всего: 4



Пргорамма работает на инструментальном компьютере, где локаль настроена на UTF-8.
Она готовит структуры данных, которые записываются в файл.
Некоторые поля этой структуры - текстовые.
Файлы переносятся на целевой компьютер,  локаль которого настроена на KOI8-R.
В связи с этим вопрос :
Как надо организоват перекодировку текстовых полей структуры данных, перед записью в файл ?
  При этом,
  • На экране текстовые поля вводятся в экземпляр класса QPlainTextEdit
  • Строковые поля в структуре описаны как  unsigned char date[1024]
  • Запись в файл осуществляется методом QFile::write.

PM MAIL   Вверх
Фантом
Дата 8.1.2011, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


Профиль
Группа: Участник Клуба
Сообщений: 1516
Регистрация: 23.3.2008

Репутация: нет
Всего: 49



А зачем? Не проще ли уже готовые файлы обработать каким-нибуть iconv'ом, и не изобретать велосипед?
PM   Вверх
svlary
Дата 8.1.2011, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: нет
Всего: 4



Цитата(Фантом @  8.1.2011,  14:54 Найти цитируемый пост)
Не проще ли уже готовые файлы обработать каким-нибуть iconv'ом

К сожалению - не проще... Дело в том, что файл сам по себе - НЕ текстовый. Там ЧАСТЬ полей - текстовые. Поэтому натравливать на него iconv - довольно рисковано.
Я пытался вызывать iconv в программе, но запутался в конвертации QString в char* - получается. что для конвертации кодирвки в iconv строки UTF-8 уже должны быть конверированы в однобайтовые char*...  Какой-то замкнутый круг получается !

PM MAIL   Вверх
bsa
Дата 9.1.2011, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



svlary, при чтении файла используй статический метод QString::fromUtf8(const char *);

Добавлено через 3 минуты и 44 секунды
Цитата(svlary @  8.1.2011,  20:45 Найти цитируемый пост)
что для конвертации кодирвки в iconv строки UTF-8 уже должны быть конверированы в однобайтовые char*...
Код
QString text;
//...
QByteArray utf8 = text.toUtf8;
write(file, utf8.data(), utf8.size());

PM   Вверх
svlary
Дата 16.1.2011, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: нет
Всего: 4



Цитата(bsa @  9.1.2011,  11:14 Найти цитируемый пост)
при чтении файла используй статический метод QString::fromUtf8(const char *);

  Наверное, я недостаточно четко изложил задачу, но
  • Файл мне нужно не ЧИТАТЬ, а наоборот - ПИСАТЬ.
  • Исходные данные - QString в кодировке UTF-8
  • Выходные данные - unsigned char[] в кодировке KOI8-R
 Пытался использовать вызов iconv, но получается вобще какая-то загадочная хрень :

Код

    iconv_t it;
    size_t ll, wll, len_1, len_2;
    char *inp, *otp;
    int  len_3;


   // Перекодируем поле данных из экранной формы
    QString from_form = ui->date_plainTextEdit->toPlainText();
    QByteArray ba = from_form.toUtf8();
    len_1 = ba.length();
    len_2 = 1024;  // Длина выходного буфера
 
// Подготавливаем и вызываем iconv
    it =  iconv_open("UTF-8", "KOI8R");
    inp = (char *)ba.data_ptr();
    otp = &(p71.date[0]);  // Это буфер перекодированного сообщения
 
   len_3 = iconv(it, &inp, &len_1, &otp, &len_2);
    iconv_close(it);
    len_3 = 1024-len_2; // Сколько байт iconv записал в выходной буфер

    // Пишем сформированную структуру в файл
    wll = fn.write((char *)&p71, sizeof(p71)-1024+len_3);



Если я на экране ввожу в поле редактирования строку "ABCАБВ", то в файл пишется какая-то полная ахинея...
В 16-ричном виде :
Цитата

01 31 20 33 31 20 32 30 20

Такое впечатление, что это - СИМВОЛЬНАЯ запись 16-ричного представления какой-то строки цифр...
Что за бред ?!
PM MAIL   Вверх
bsa
Дата 18.1.2011, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



http://doc.qt.nokia.com/4.7/qtextcodec.html#codecForName
Код
QTextCodec *koiCodec = codecForName("KOI8-R");
QByteArray data = koiCodec->fromUnicode(ui->date_plainTextEdit->toPlainText());
//...

PM   Вверх
svlary
Дата 30.1.2011, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 8.9.2009

Репутация: нет
Всего: 4



Большое спасибо за точный и ясный ответ! Долго не возвращался к этой проблеме - была срочная работа, а сегодня проверил - все сразу заработало !  smile
PM MAIL   Вверх
bsa
Дата 30.1.2011, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



svlary, кстати, QString данные хранит не в кодировке UTF-8.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.