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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==?  (Прочитано 9767 раз)
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« : Август 20, 2009, 19:35 »

Получаю из базы SQLite поле с текстом например "\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438"

Если взять и написать вручную QString::fromLocal8Bit("\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0438") то текст получается кирилицей, все в норме потому что слэши одинарные.
Но строка из базы включает в себя строчный слэш "\\", а не одно символьный "\u0414"
всякие манипуляции типа .replace("\\u","\u") не дают результата.

Чем можно перевести такую строку в кирилицу используя Qt4?
замучился я уже, буду рад помощи Улыбающийся
Записан
Rcus
Гость
« Ответ #1 : Август 20, 2009, 20:00 »

Так этож просто UTF16 коды. Не знаю есть ли такой кодек в Qt, но и написать его самому не такая большая проблема.
Записан
fuCtor
Гость
« Ответ #2 : Август 21, 2009, 09:05 »

Цитировать
QString QString::fromUtf16 ( const ushort * unicode, int size = -1 )   [static]

Returns a QString initialized with the first size characters of the Unicode string unicode (ISO-10646-UTF-16 encoded).

If size is -1 (default), unicode must be terminated with a 0.

QString makes a deep copy of the Unicode data.
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #3 : Август 23, 2009, 02:27 »

Rcus, спасибо за совет, может подскажете где найти алгоритм как перевести символ?

Цитировать
QString QString::fromUtf16 ( const ushort * unicode, int size = -1 )   [static]

Returns a QString initialized with the first size characters of the Unicode string unicode (ISO-10646-UTF-16 encoded).

If size is -1 (default), unicode must be terminated with a 0.

QString makes a deep copy of the Unicode data.

Хорошо, функция понятна, но как обращаться с ushort?

Пробую QString::fromUtf16(t_str.toUShort())
Получаю ошибку
"cannot convert parameter 1 from 'ushort' to 'const ushort *'"

ushort sh =t_str.toUShort();
QMessageBox::warning(this,"",QString::fromUtf16(&sh));
так без ошибки но получаю пустую строку

QString::fromUtf16((const ushort *)t_str.toUShort())
тоже получаю пустую строку

как правильно с етим работать?

PS: кому интересно скажу, что этот алгоритм мне нужен для версии плагина для Dropbox: http://wiki.getdropbox.com/DropboxAddons/DropBoxPlugin
« Последнее редактирование: Август 23, 2009, 02:54 от IGHOR » Записан
Rcus
Гость
« Ответ #4 : Август 23, 2009, 05:44 »

Я же сказал что это utf16 коды (в hex'ах), какой тут может быть алгоритм? Хотя если посмотреть как кодируются английские буквы будет понятнее. Более всего похоже на способ кодирования принятый в JSON.
Записан
fuCtor
Гость
« Ответ #5 : Август 23, 2009, 09:22 »

Только сейчас заметил:
Цитировать
всякие манипуляции типа .replace("\\u","\u") не дают результата.
Компилятор все это превратит в \u и какой-то служебный символ на подобии \n.
Попробуйте просто записать .replace("\\u","u"), теоретически должно сработать.

А если переводить из хексов, то есть опять же статический метод:
Цитировать
QByteArray QByteArray::fromHex ( const QByteArray & hexEncoded )   [static]
Returns a decoded copy of the hex encoded array hexEncoded. Input is not checked for validity; invalid characters in the input are skipped, enabling the decoding process to continue with subsequent characters.
For example:
         QByteArray text = QByteArray::fromHex("517420697320677265617421");
         text.data();            // returns "Qt is great!"
« Последнее редактирование: Август 23, 2009, 09:24 от fuCtor » Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #6 : Август 23, 2009, 16:49 »

Попробуйте просто записать .replace("\\u","u"), теоретически должно сработать.
Пробовал, не работает.
а при QByteArray::fromHex("0414043E043A0443043C0435") получается ">:C<5"
Записан
zenden
Гость
« Ответ #7 : Август 23, 2009, 16:58 »

ну как-то так

Код:
QString test = "\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438";
test.remove("\\u");
QByteArray temp = QByteArray::fromHex(test.toAscii().data());
QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
QString result = codec->toUnicode(temp); //"Документи"

вместо всей этой мишуры с QTextCodec можно попробовать поменять байты попарно местами, но я не знаю, можно ли это сделать средствами QByteArray или нужно писать самому, после чего использовать test.fromUtf16()
« Последнее редактирование: Август 23, 2009, 17:18 от zenden » Записан
denka
Гость
« Ответ #8 : Август 23, 2009, 17:11 »

Хорошо, функция понятна, но как обращаться с ushort?

Пробую QString::fromUtf16(t_str.toUShort())
Получаю ошибку
"cannot convert parameter 1 from 'ushort' to 'const ushort *'"

ushort sh =t_str.toUShort();
QMessageBox::warning(this,"",QString::fromUtf16(&sh));
так без ошибки но получаю пустую строку

QString::fromUtf16((const ushort *)t_str.toUShort())
тоже получаю пустую строку

как правильно с етим работать?

А как правильно работать с Си строкой? Вас не смущают ваши действия по отношению к юникод строке? Все что вам нужно было сделать так это преобразовать char * к ushort *

В данных случаях вам повезло так как toUShort() вернул вам ноль, иначе бы получили бы грабли ввиде сегфолта или еще хуже какое нибудь значение
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #9 : Август 23, 2009, 17:55 »

ну как-то так

Код:
QString test = "\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438";
test.remove("\\u");
QByteArray temp = QByteArray::fromHex(test.toAscii().data());
QTextCodec *codec = QTextCodec::codecForName("UTF-16BE");
QString result = codec->toUnicode(temp); //"Документи"

вместо всей этой мишуры с QTextCodec можно попробовать поменять байты попарно местами, но я не знаю, можно ли это сделать средствами QByteArray или нужно писать самому, после чего использовать test.fromUtf16()

Спасибо! Работает,
правда для случая
   QString test = "C:\\u005C\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438\\u005CMy Dropbox";
не похдодит, но я напишу посимвольный перебор и попробую туда и обратно кодировать.

den'ka, смущает перебор циклом по символах, пытался как-то по другому сделать
« Последнее редактирование: Август 23, 2009, 20:22 от IGHOR » Записан
Rcus
Гость
« Ответ #10 : Август 23, 2009, 18:25 »

/**
  Диалог в мыслях:
  - Левое, похоже ваше предложение опять проигнорировано.
  - Знаю, Правое. Большинство случаев безнадежны, но если раздавать достаточно лопат, то может быть с следующий раз нам накопают немного.
  - Эх, Левое, мне бы ваш оптимизм... Не нужны им лопаты - земля нужна, а копать не хотят
  - Правое, если их упрекать в этом - будет похоже на троллинг, тоньше надо
*/
Записан
IGHOR
Крякер
****
Offline Offline

Сообщений: 390



Просмотр профиля WWW
« Ответ #11 : Август 23, 2009, 18:59 »

Rcus, намек понят, тоньше не бывает Улыбающийся
но есть хорошая пословица "Лучше раз показать, чем десять раз рассказать".

С переводом в юникод и назад разобрался, спасибо всем за время!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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