Russian Qt Forum

Qt => Вопросы новичков => Тема начата: nachinaushij от Январь 06, 2013, 13:52



Название: Qt5 и setCodecForCStrings
Отправлено: nachinaushij от Январь 06, 2013, 13:52
Кто-нибудь знает, каким образом теперь решается проблема с кодировкой данных, возвращаемых функциями? В данном случае меня интересует QDir::entryList(), которая используется в примере FindFiles. Ни в какую не хочет перебирать файло в папке с русским названием.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: Bepec от Январь 06, 2013, 14:02
Видимо так же как и в 4.7.2. Возвращает UTF8 QString.



Название: Re: Qt5 и setCodecForCStrings
Отправлено: nachinaushij от Январь 06, 2013, 14:24
Вот этот же код, в 4.8 работает.
Код
C++ (Qt)
   currentDir = QDir(path);
   QStringList files;
   if (fileName.isEmpty())
       fileName = "*";
   files = currentDir.entryList(QStringList(fileName),
                                QDir::Files | QDir::NoSymLinks);

Но при условии, что в main.cpp есть строки:

Код
C++ (Qt)
   QTextCodec* codec = QTextCodec::codecForName("utf8");
   QTextCodec::setCodecForCStrings(codec);

В Qt 5 функция setCodecForCStrings выпилена. А без неё, вышеприведённый кусок кода, не работает, если path = /home/user/блаблабла


Название: Re: Qt5 и setCodecForCStrings
Отправлено: Bepec от Январь 06, 2013, 14:39
Задавай строку в UTF8 в tr.

Это не проблема функции, это проблема того, что ты передаёшь херню в path.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: nachinaushij от Январь 06, 2013, 14:57
Упс ... Сорри! Всё работает. Вот это я ступил ... Просто рекурсию надо добавить, а я жду выхлопа ...

Тему можно смело удалить. Ибо ерунда полная.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: sergek от Февраль 22, 2013, 10:23
И все же, интересно, если в исходниках (не в utf-8) есть строковые константы
Код:
QString blabla = "блаблабла";
как быть без setCodecForCStrings? Пока кроме чего-то подобного
Код:
QString cvt(const char* str){
    return QTextCodec::codecForName("Кодировка исходников")->toUnicode(str);
}
ничего не приходит в голову. А судя по реакции джедаев, это не кошерно..


Название: Re: Qt5 и setCodecForCStrings
Отправлено: carrygun от Февраль 22, 2013, 10:34
Сохранять исходники в Utf-8.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: ViTech от Февраль 22, 2013, 10:59
Вот это не кошерно:
И все же, интересно, если в исходниках (не в utf-8) есть строковые константы
Код:
QString blabla = "блаблабла";
Строковых констант на кириллице быть не должно. Кошерно вот так:
Код:
QString blabla = tr("blablabla");
с последующим переводом в linguist на любой язык.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: sergek от Февраль 22, 2013, 11:31
Сохранять исходники в Utf-8.
Это понятно, мешает только одно - исходники я использую в проектах Qt и C++ Builder. Последний utf-8 не понимает.

Строковых констант на кириллице быть не должно. Кошерно вот так:
Код:
QString blabla = tr("blablabla");
с последующим переводом в linguist на любой язык.
Этот совет здесь давали 100500 раз, можно было и не повторяться - а то разбудите джедаев  :) Как вы через тр прогоните, к примеру, такой текст шаблона для текстовой формы:
Код:
// шаблоны
const QByteArray TMPL_ED101=
"                                                                            \r\n"
"Порядковый номер                    Дата составления                        \r\n"
"электронного документа <EDNo>       электронного документа <EDDate  >       \r\n"
"                                                                            \r\n"
"Уникальный                                                                  \r\n"
"идентификатор составителя <EDAuthor>                                        \r\n"
"                                                <FileDateCaption         >  \r\n"
"                                                         <FileDate>         \r\n"
"    <#62      >                 <#71      >                       --------- \r\n"
"-------------------         -------------------                  | 0401060 |\r\n"
"Поступ.в банк плат.         Списано со сч.плат.                   --------- \r\n"
"                                                                       ---- \r\n"
"ПЛАТЕЖНОЕ ПОРУЧЕНИЕ № <#3,3>       <#4       >        <#5       >        | <#101,2> |\r\n"
"                            -----------------   -----------------      ---- \r\n"
"                                   Дата            Вид платежа              \r\n"
"Сумма    |<#6                                                              >\r\n"
"прописью |                                                                  \r\n"
"         |                                                                  \r\n"
"----------------------------------------------------------------------------\r\n"
"ИНН <#60        >  |КПП <#102   >      | Сумма |<#7                >        \r\n"
"---------------------------------------|       |                            \r\n"
"<#8                                   >|       |                            \r\n"
"                                       |------------------------------------\r\n"
"                                       | Сч.№  |<#9                >        \r\n"
"                                       |       |                            \r\n"
"                                       |       |                            \r\n"
"Плательщик                             |       |                            \r\n"
"-----------------------------------------------|                            \r\n"
"<#10                                  >| БИК   |<#11    >                   \r\n"
"                                       |-------|                            \r\n"
"Банк плательщика                       | Сч.№  |<#12               >        \r\n"
"----------------------------------------------------------------------------\r\n"
"<#13                                  >| БИК   |<#14    >                   \r\n"
"                                       |-------|                            \r\n"
"Банк получателя                        | Сч.№  |<#15               >        \r\n"
"-----------------------------------------------|                            \r\n"
"ИНН <#61       >   |КПП <#103   >      | Сч.№  |<#17               >        \r\n"
"---------------------------------------|       |                            \r\n"
"<#16                                  >|------------------------------------\r\n"
"                                       |Вид оп.|<#18,2>    |Срок плат.|          \r\n"
"                                       |-------|      |----------|          \r\n"
"                                       |Наз.пл.|      |Очер.плат.|<#21,1>         \r\n"
"                                       |-------|      |----------|          \r\n"
"Получатель                             |Код    |      |Рез. поле |          \r\n"
"----------------------------------------------------------------------------\r\n"
"<#104              >|<#105     >|<#106,2>|<#107    >|<#108         >|<#109    >|<#110,2>\r\n"
"----------------------------------------------------------------------------\r\n"
"<#24                                                                       >\r\n"
"                                                                            \r\n"
"                                                                            \r\n"
"                                                                            \r\n"
"                                                                            \r\n"
"Назначение платежа                                                          \r\n"
"----------------------------------------------------------------------------\r\n"
"                             Подписи                      Отметки банка     \r\n"
"                                                                            \r\n"
"                                                                            \r\n"
"          М.П.                                                              \r\n"
"                                                                            \r\n";


Название: Re: Qt5 и setCodecForCStrings
Отправлено: carrygun от Февраль 22, 2013, 11:42
Я бы держал во внешних файлах/бд в зависимости от задачи, а не зашивал в приложение. Этож кошмар какойто. Из того же файла текстстримом читай как тебе надо.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: ViTech от Февраль 22, 2013, 12:17
Действительно, джедаев лучше не будить. Если они такое увидят, то больше не смогут спокойно спать.

Я бы держал во внешних файлах/бд в зависимости от задачи, а не зашивал в приложение.

Вы что?! А если понадобится одну букву в форме изменить? Это ж можно будет только текстовый файл/бд поправить. А как же перекомпилировать приложение? А пересобрать дистрибутив? А распространить всем, кто им пользуется и переустановить? За что тогда программисты будут зарплату получать? :)


Название: Re: Qt5 и setCodecForCStrings
Отправлено: sergek от Февраль 22, 2013, 12:32
Я бы держал во внешних файлах/бд в зависимости от задачи, а не зашивал в приложение. Этож кошмар какойто. Из того же файла текстстримом читай как тебе надо.
Хм.. Этот текст за последние 12 лет, если не ошибаюсь, менялся пару раз. Остальные 59 шаблонов меняются либо синхронно с программой, либо не меняются вовсе. Для пользователя программы давать возможность лезть в шаблоны нет необходимости, более того, вредно. Чего ради городить огород с внешними файлами/бд?
Да и не в них дело-то. Примеры можно привести и другие, когда перевод с помощью тр невозможен.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: carrygun от Февраль 22, 2013, 12:54
Я бы держал во внешних файлах/бд в зависимости от задачи, а не зашивал в приложение. Этож кошмар какойто. Из того же файла текстстримом читай как тебе надо.
Хм.. Этот текст за последние 12 лет, если не ошибаюсь, менялся пару раз. Остальные 59 шаблонов меняются либо синхронно с программой, либо не меняются вовсе. Для пользователя программы давать возможность лезть в шаблоны нет необходимости, более того, вредно. Чего ради городить огород с внешними файлами/бд?
Да и не в них дело-то. Примеры можно привести и другие, когда перевод с помощью тр невозможен.


Я ничего не отрицаю про tr. Но в случае с шаблоном ситуации разные бывают. Вот 12 лет не менялось, а теперь вдруг начнет меняться? А что если часто меняться? А если сырцы про**али? Да та же проблема с кодировкой, 12 лет назад не в Utf могли писать. Могут быть тысячи всяких дурацких вариантов из-за которых придется пересобирать приложение, потому что изменился шаблон.

Ну вообще кто как хочет - тот так кодит. Я просто сказал как сделал бы.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: lit-uriy от Февраль 23, 2013, 17:07
>>Этож кошмар какойто
Именно.
Вообще я всякое предполагал об авторах около банковско-бухгалтерских программ, но, блин, такое Г мне в голову не пришло.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: sergek от Февраль 23, 2013, 18:27
такое Г мне в голову не пришло.
Просил же не будить миротворцев... Пользы - ноль.


Название: Re: Qt5 и setCodecForCStrings
Отправлено: sergek от Февраль 23, 2013, 19:06
Виноват, иногда все ж польза бывает, правда, косвенная ;) В соседней ветке была ссылка на
Цитировать
вот блх Тьяго Мациеира (все знают кто такой?)
Собственно, там и есть исчерпывающий ответ:
Цитировать
You’ll either have to recode your source code to UTF-8, or you will need to wrap those strings with a suitable QLatin1String or QTextCodec::toUnicode call.
И рекомендации:
Цитировать
I highly recommend choosing the former option: use UTF-8 in your source code.
Если отсеять матюки в этой ветке, оба решения здесь и прозвучали.