Название: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: IGHOR от Август 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? замучился я уже, буду рад помощи :) Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: Rcus от Август 20, 2009, 20:00 Так этож просто UTF16 коды. Не знаю есть ли такой кодек в Qt, но и написать его самому не такая большая проблема.
Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: fuCtor от Август 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. Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: IGHOR от Август 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 Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: Rcus от Август 23, 2009, 05:44 Я же сказал что это utf16 коды (в hex'ах), какой тут может быть алгоритм? Хотя если посмотреть как кодируются английские буквы будет понятнее. Более всего похоже на способ кодирования принятый в JSON.
Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: fuCtor от Август 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!" Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: IGHOR от Август 23, 2009, 16:49 Попробуйте просто записать .replace("\\u","u"), теоретически должно сработать. Пробовал, не работает.а при QByteArray::fromHex("0414043E043A0443043C0435") получается ">:C<5" Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: zenden от Август 23, 2009, 16:58 ну как-то так
Код: QString test = "\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438"; вместо всей этой мишуры с QTextCodec можно попробовать поменять байты попарно местами, но я не знаю, можно ли это сделать средствами QByteArray или нужно писать самому, после чего использовать test.fromUtf16() Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: denka от Август 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() вернул вам ноль, иначе бы получили бы грабли ввиде сегфолта или еще хуже какое нибудь значение Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: IGHOR от Август 23, 2009, 17:55 ну как-то так Код: QString test = "\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438"; вместо всей этой мишуры с QTextCodec можно попробовать поменять байты попарно местами, но я не знаю, можно ли это сделать средствами QByteArray или нужно писать самому, после чего использовать test.fromUtf16() Спасибо! Работает, правда для случая QString test = "C:\\u005C\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D\\u0442\\u0438\\u005CMy Dropbox"; не похдодит, но я напишу посимвольный перебор и попробую туда и обратно кодировать. den'ka, смущает перебор циклом по символах, пытался как-то по другому сделать Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: Rcus от Август 23, 2009, 18:25 /**
Диалог в мыслях: - Левое, похоже ваше предложение опять проигнорировано. - Знаю, Правое. Большинство случаев безнадежны, но если раздавать достаточно лопат, то может быть с следующий раз нам накопают немного. - Эх, Левое, мне бы ваш оптимизм... Не нужны им лопаты - земля нужна, а копать не хотят - Правое, если их упрекать в этом - будет похоже на троллинг, тоньше надо */ Название: Re: QString::fromLocal8Bit("\\u0414\\u043E\\u043A\\u0443\\u043C\\u0435\\u043D")==? Отправлено: IGHOR от Август 23, 2009, 18:59 Rcus, намек понят, тоньше не бывает :)
но есть хорошая пословица "Лучше раз показать, чем десять раз рассказать". С переводом в юникод и назад разобрался, спасибо всем за время! |