Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: n4ela от Ноябрь 28, 2009, 20:10



Название: Кодировка и строки
Отправлено: n4ela от Ноябрь 28, 2009, 20:10
В линуксе, использую emacs и все строки пишу так: QString::fromLocal8Bit( "текс" ), хотел скомпилировать проект под виндой, установил qtcreator, и весь текст в моей программе стал нечитабельным. Можно в каждом файле выполнить edit => select encoding и выбрать там utf-8, но это сделает читабельным текст в исходниках, но не в программе.
Как лучше работать со строками что бы не иметь проблем с кодировкой?


Название: Re: Кодировка и строки
Отправлено: Пантер от Ноябрь 28, 2009, 20:20
Используй tr и латиницу.


Название: Re: Кодировка и строки
Отправлено: niXman от Ноябрь 28, 2009, 20:41
Цитировать
Как лучше работать со строками что бы не иметь проблем с кодировкой?
Хранить их в БД, файле, ts-файле.


Название: Re: Кодировка и строки
Отправлено: zenden от Ноябрь 28, 2009, 20:56
В свойствах проекта можно поставить кодировку Default editor encoding = UTF-8, а соответственно  писать QString::fromUtf8()
или
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))


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


Название: Re: Кодировка и строки
Отправлено: zenden от Ноябрь 28, 2009, 22:13
Цитировать
Ни разу не правильно! А если нужно будет в каком-нибудь QTextEdit текст в кои8р?

и чем setCodecForCStrings помешает это сделать?
использование setCodecForCStrings еще не означает, что оперировать текстом в другой кодировке будет нельзя.
К тому же сам QString всегда использует кодировку UTF-16.


Название: Re: Кодировка и строки
Отправлено: Павел_F. от Ноябрь 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.


Название: Re: Кодировка и строки
Отправлено: zenden от Ноябрь 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 необоснованы.


Название: Re: Кодировка и строки
Отправлено: Павел_F. от Ноябрь 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 ничего похожего нет.


Название: Re: Кодировка и строки
Отправлено: n4ela от Ноябрь 30, 2009, 18:25
Спасибо всем за ответы, выбрал использования tr