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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировка и строки  (Прочитано 12592 раз)
n4ela
Гость
« : Ноябрь 28, 2009, 20:10 »

В линуксе, использую emacs и все строки пишу так: QString::fromLocal8Bit( "текс" ), хотел скомпилировать проект под виндой, установил qtcreator, и весь текст в моей программе стал нечитабельным. Можно в каждом файле выполнить edit => select encoding и выбрать там utf-8, но это сделает читабельным текст в исходниках, но не в программе.
Как лучше работать со строками что бы не иметь проблем с кодировкой?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 28, 2009, 20:20 »

Используй tr и латиницу.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
niXman
Гость
« Ответ #2 : Ноябрь 28, 2009, 20:41 »

Цитировать
Как лучше работать со строками что бы не иметь проблем с кодировкой?
Хранить их в БД, файле, ts-файле.
Записан
zenden
Гость
« Ответ #3 : Ноябрь 28, 2009, 20:56 »

В свойствах проекта можно поставить кодировку Default editor encoding = UTF-8, а соответственно  писать QString::fromUtf8()
или
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))
Записан
Павел_F.
Гость
« Ответ #4 : Ноябрь 28, 2009, 22:01 »

В свойствах проекта можно поставить кодировку Default editor encoding = UTF-8, а соответственно  писать QString::fromUtf8()
или
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))
Ни разу не правильно! А если нужно будет в каком-нибудь QTextEdit текст в кои8р?
+1 к использованию tr и setCodecForTr. Тогда можно будет задать кодировку для интерфейса программы и в самой программе оперировать текстом в нужной кодировке ( отличной от кодировки интерфейса самой программы). Еще и для поддержки "многоязычности" полезно.
Записан
zenden
Гость
« Ответ #5 : Ноябрь 28, 2009, 22:13 »

Цитировать
Ни разу не правильно! А если нужно будет в каком-нибудь QTextEdit текст в кои8р?

и чем setCodecForCStrings помешает это сделать?
использование setCodecForCStrings еще не означает, что оперировать текстом в другой кодировке будет нельзя.
К тому же сам QString всегда использует кодировку UTF-16.
Записан
Павел_F.
Гость
« Ответ #6 : Ноябрь 28, 2009, 23:23 »

Цитировать
void QTextCodec::setCodecForCStrings ( QTextCodec * codec )   [static]

Sets the codec used by QString to convert to and from const char * and QByteArrays. If the codec is 0 (the default), QString assumes Latin-1.
void QTextCodec::setCodecForTr ( QTextCodec * c )   [static]

Sets the codec used by QObject::tr() on its argument to c. If c is 0 (the default), tr() assumes Latin-1.

If the literal quoted text in the program is not in the Latin-1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:

 int main(int argc, char *argv[])
 {
     QApplication app(argc, argv);
     QTextCodec::setCodecForTr(QTextCodec::codecForName("eucKR"));
     ...
 }
Note that this is not the way to select the encoding that the user has chosen. For example, to convert an application containing literal English strings to Korean, all that is needed is for the English strings to be passed through tr() and for translation files to be loaded. For details of internationalization, see Internationalization with Qt.
Читайте справку.
Используя setCodecForCStrings мы задаем кодек который будет использован у QString. А для русского( и не только) интерфейса в Qt есть setCodecForTr.
Представим простую задачу: Например наша прога( ее исходники) в utf8 нужно работать с текстовым файлом у которого koi8-r. С вашим подходом это нереально. С setCodecForTr на интерфейс и setCodecForCStrings на QString запросто.
Цитировать
QString QObject::tr ( const char * sourceText, const char * disambiguation = 0, int n = -1 )   [static]

Returns a translated version of sourceText, optionally based on a disambiguation string and value of n for strings containing plurals; otherwise returns sourceText itself if no appropriate translated string is available.
При правильно заданном setCodecForTr функция QObject::tr( "текст") вернет правильный QString.
« Последнее редактирование: Ноябрь 28, 2009, 23:28 от Павел_F. » Записан
zenden
Гость
« Ответ #7 : Ноябрь 29, 2009, 01:49 »

Код:
Читайте справку.
Используя setCodecForCStrings мы задаем кодек который будет использован у QString.

Неверно: используя setCodecForCStrings мы задаем кодек, используемый при конвертации из строк Си (отсюда и название функции) в QString.

Код:
The QString class provides a Unicode character string.

QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. (Unicode characters with code values above 65535 are stored using surrogate pairs, i.e., two consecutive QChars.)

А чтобы прочитать текстовый файл в кодировке KOI8-R достаточно вызвать метод класса QTextStream
read_stream.setCodec( QTextCodec::codecForName("KOI8-R ") );

или если у нас строка char * str в KOI8-R кодировке, можно воспользоваться  методом
QTextCodec::codecForName("KOI8-R ")->toUnicode(str)

Поэтому ваши претензии к функции setCodecForCStrings необоснованы.
« Последнее редактирование: Ноябрь 29, 2009, 01:56 от zenden » Записан
Павел_F.
Гость
« Ответ #8 : Ноябрь 29, 2009, 02:10 »

Реализовать можно всякое. И шурупы можно молотком забивать. Но если вчитаться в
Цитировать
If the literal quoted text in the program is not in the Latin-1 encoding, this function can be used to set the appropriate encoding. For example, software developed by Korean programmers might use eucKR for all the text in the program, in which case the main() function might look like this:
Еще раз. То станет понятно что для отображения строк которые лежат в исходниках программы следует использовать tr(), по крайней мере именно об этом гласит справка Qt.
Примерный смысл на русском таков
Цитировать
Если исходный текст программы не в Latin-1 кодировке, эта функция может быть использована для установки кодировки, соответствующей исходному тексту программы. Например, программное обеспечение, разработанное корейским программистом могут использовать eucKR для исходных текстов программы...
То есть они весьма однозначно намекают на смысл этой функции.
А если вчитаться в справку по setCodecForCString ничего похожего нет.
Записан
n4ela
Гость
« Ответ #9 : Ноябрь 30, 2009, 18:25 »

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


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