Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Имеется: ОС Linux 2.4.32 (RedHat) Qt 4.6 gcc 4.1.3 Рабочая кодировка ОС: koi8-r GUI проект внутри кодировка выставлена в: Код: plaintext 1. В одной из частей проекта необходимо произвести копирование файлов. Используется следующий код: Код: plaintext 1. Всё прекрасно копируется за одним но: файлы в кодировке сp1251 автоматически при копировании конвертируются в koi8-r, что не допустимо. Данные файлы являются бинарными файлами с информацией используемой другим приложением. Другие текстовые файлы созданные вручную с кодировкой cp1251, под такую проблему не попадают и копируются нормально. Написаны две функции заменители копирования без использования Qt, но в том же проекте: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. Результат тот же. При копировании в новых файлах конвертированное содержимое, но если использовать последние два варианта в чистом коде без Qt копирование происходит нормально. Собственно вопрос: что происходит? Каким образом Qt может влиять на кодировку вплоть до использования fopen(...) и как это обойти в коде? З.Ы. На крайний случай есть вариант с system("cp ..."), но это уж если совсем будет плохо. З.Ы. Вариант с использование QTextStream с выставленной кодировкой выходного файла так же не желателен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 20:20 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleoРабочая кодировка ОС: koi8-r Что значит "рабочая кодировка ОС"? Нет такого понятия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:11 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, LANG=ru_RU.KOI8-R Если бы я написал не "рабочая кодировка ОС", а "системная локаль" Вам было бы понятнее? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:21 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleo[/src] Написаны две функции заменители копирования без использования Qt, но в том же проекте: Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. 5. 6. 7. . ну, помимо всех сказок, код-то неверный. fgetc возвращает int, а не char, и EOF имеет тип int. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:27 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
Всё прекрасно копируется за одним но: файлы в кодировке сp1251 автоматически при копировании конвертируются в koi8-r, что не допустимо. Данные файлы являются бинарными файлами с информацией используемой другим приложением. так если это бинарные файлы, то какое вообще отношение имеет к нему кодировки? Другие текстовые файлы созданные вручную с кодировкой cp1251, под такую проблему не попадают и копируются нормально. а не вручную - это как ? Результат тот же. При копировании в новых файлах конвертированное содержимое, но если использовать последние два варианта в чистом коде без Qt копирование происходит нормально. кто на ком стоял? Собственно вопрос: что происходит? Каким образом Qt может влиять на кодировку вплоть до использования fopen(...) и как это обойти в коде? не может он ни на что влиять... ну, если копировать с помощью QT, то там могут использоваться или нет BOM, но в конце концов можно копировать файлы как бинарные, через байтовый буфер. в любом случае, без кода обсуждать что бесполезно, нужны исходники. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:43 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
авторну, помимо всех сказок, код-то неверный. fgets возвращает int, а не char, и EOF имеет тип int. Простите что? fgets я не использую. И прототип функции fgets выглядит по другому. То что при написании я задал тип char для ch это да. Ошибся когда писал сообщение, естественно туда нужен int, но дефакто это будет влиять только на обработку EOF. Код: plaintext 1. 2. И что же вы имеете ввиду под "сказками"? Может как-то обоснуете свои "заявления"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:47 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleo, Я описАлся, fgetc ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:50 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleoИ что же вы имеете ввиду под "сказками"? Может как-то обоснуете свои "заявления"? Я в общем все уже написал. 1) ничего никуда само конвертироваться не может. 2) QT на это никак не влияет 3) ну и так далее. Код код код, нужен код, который воспроизводит проблему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 22:58 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
вот тут есть хорошие примеры кода для м копирования файла, можешь взять любой. https://www.google.ru/url?sa=t&source=web&rct=j&url=https://stackoverflow.com/questions/10195343/copy-a-file-in-a-sane-safe-and-efficient-way&ved=0ahUKEwic48zg1pjVAhXhC5oKHXxfDhEQFggjMAA&usg=AFQjCNE5GcLls2I_DykaW034YFmZqgOVMw файлы открывай только как бинарные и копией как бинарные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 23:18 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, автортак если это бинарные файлы, то какое вообще отношение имеет к нему кодировки? ну наверно разработчики этих файлов решили их так кодировать, что строковые значения можно спокойно добыть из файла любым редактором, а сами строки хранятся в cp1251. автора не вручную - это как ? Получены со стороны. А вручную означало, что были сделаны тестовые файлы руками. Естественно они не равны по содержимому тем которые пришли изначально. авторкто на ком стоял? Если написать простое приложение без использование Qt, то результат копирования нормальный. авторне может он ни на что влиять... Ок! Тогда почему при копировании файла file1 весом 2740 байт, я получаю файл file2 весом 5308 байт? Используется QFile::copy(file1, file2). авторКод код код, нужен код, который воспроизводит проблему. Весь код в первом сообщении, если не брать в расчёт имён файлов и методов открытия файлов. И всё же ещё раз повторюсь. Изначально копируется файл методом: Код: plaintext 1. На входе файл весом 2740, на выходе копия весом 5308. При анализе содержимого получено файла выявлено, что все текстовые строки закодированные через cp1251 были перекодированы в koi8-r. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 23:19 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleoНа входе файл весом 2740, на выходе копия весом 5308. При анализе содержимого получено файла выявлено, что все текстовые строки закодированные через cp1251 были перекодированы в koi8-r. ну если у тебя размер файла меняется, значит где-то ошибка, логично? даже если что то у тебя перекодирует из cp1251 в koi8-r, это все однобайтовые кодировки, размер не должен увеличиваться. логично? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 23:25 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, авторвот тут есть хорошие примеры кода для м копирования файла, можешь взять любой. https://www.google.ru/url?sa=t&source=web&rct=j&url=https://stackoverflow.com/questions/10195343/copy-a-file-in-a-sane-safe-and-efficient-way&ved=0ahUKEwic48zg1pjVAhXhC5oKHXxfDhEQFggjMAA&usg=AFQjCNE5GcLls2I_DykaW034YFmZqgOVMw файлы открывай только как бинарные и копией как бинарные. Спасибо, Вы меня сегодня развеселили))) Я даже подумал что в первом варианте вашего сообщения без ссылки будет ссылка именно на этот пост от stackoverflow. И таки это оказался тот пост ) И даже более того, мой пример с ifstream, ofstream повторяет то, что написано в stackoverflow с точностью до имён переменных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 23:25 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, авторну если у тебя размер файла меняется, значит где-то ошибка, логично? даже если что то у тебя перекодирует из cp1251 в koi8-r, это все однобайтовые кодировки, размер не должен увеличиваться. логично? Это мне самому понятно, но факт остаётся фактом. В Qt'ом исполнении копирования файлы получаются не те. Ну а про размер я не знаю что и думать. Если только Qt конвертирует cp1251 -> utf -> koi8r с оибками при копировании. Но это точно бред. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.07.2017, 23:34 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
heleo, Сделай небольшой проектик на QT с кодом, который бы демонстрировал проблему. Код пришли сюда. Также на работе я посмотрю код этого QFile::copy. Можно было бы предположить, что QT меняет настройки локейла в CRT, но если ты будешь копировать файл как бинарный, а не как текстовый (не используя чтение в и запись из строки), настройки локейлов не используются. Так что пока похоже на проблемы неправильного понимания ситуации, неверной диагностики проблемы и пр. Т.е. либо у тебя где-то что-то делается, чего ты не знаешь, либо ты почему-то думаешь, что кодировка в файлах меняется, но реально она не меняется. Хотя у тебя ещё и размеры файлов меняются -- это вряд ли можно ошибочно интерпретировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2017, 09:01 |
|
||
|
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Спасибо, уже не нужно. Ошибка действительно не в копировании. Далее по коду вызывается стороннее АПи для чтения файлов. В новой версии АПИ оно само втихую их конвертит даже при чтении. Пока файлы не копировались они были защищены от записи учёткой root, при этом их обработка была нормальная. Ну и в доках к АПИ про такое поведение как всегда пусто. Так что можно тему закрывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.07.2017, 12:47 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39492704&tid=2018118]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 281ms |
| total: | 535ms |

| 0 / 0 |
