Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов / 15 сообщений из 15, страница 1 из 1
20.07.2017, 20:20
    #39492651
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
Доброго времени суток.

Имеется:
ОС Linux 2.4.32 (RedHat)
Qt 4.6
gcc 4.1.3
Рабочая кодировка ОС: koi8-r

GUI проект внутри кодировка выставлена в:
Код: plaintext
1.
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"))


В одной из частей проекта необходимо произвести копирование файлов.

Используется следующий код:
Код: plaintext
1.
QFile::copy(in, out);



Всё прекрасно копируется за одним но: файлы в кодировке сp1251 автоматически при копировании конвертируются в koi8-r, что не допустимо. Данные файлы являются бинарными файлами с информацией используемой другим приложением. Другие текстовые файлы созданные вручную с кодировкой cp1251, под такую проблему не попадают и копируются нормально.

Написаны две функции заменители копирования без использования Qt, но в том же проекте:
Код: plaintext
1.
2.
3.
4.
std::ifstream in;
std::ofstream out;
...
out << in.rdbuf();



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
FILE *in;
FILR *out;
...
char ch = fgetc(in);
while(ch != EOF) {
fputc(ch, out);
ch = fgetc(in); }



Результат тот же. При копировании в новых файлах конвертированное содержимое, но если использовать последние два варианта в чистом коде без Qt копирование происходит нормально.

Собственно вопрос: что происходит? Каким образом Qt может влиять на кодировку вплоть до использования fopen(...) и как это обойти в коде?

З.Ы. На крайний случай есть вариант с system("cp ..."), но это уж если совсем будет плохо.
З.Ы. Вариант с использование QTextStream с выставленной кодировкой выходного файла так же не желателен.
...
Рейтинг: 0 / 0
20.07.2017, 22:11
    #39492686
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleoРабочая кодировка ОС: koi8-r

Что значит "рабочая кодировка ОС"?
Нет такого понятия.
...
Рейтинг: 0 / 0
20.07.2017, 22:21
    #39492692
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
MasterZiv,

LANG=ru_RU.KOI8-R

Если бы я написал не "рабочая кодировка ОС", а "системная локаль" Вам было бы понятнее?
...
Рейтинг: 0 / 0
20.07.2017, 22:27
    #39492694
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleo[/src]

Написаны две функции заменители копирования без использования Qt, но в том же проекте:
Код: plaintext
1.
2.
3.
4.
std::ifstream in;
std::ofstream out;
...
out << in.rdbuf();



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
FILE *in;
FILR *out;
...
char ch = fgetc(in);
while(ch != EOF) {
fputc(ch, out);
ch = fgetc(in); }



.


ну, помимо всех сказок, код-то неверный.
fgetc возвращает int, а не char, и EOF имеет тип int.
...
Рейтинг: 0 / 0
20.07.2017, 22:43
    #39492696
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
Всё прекрасно копируется за одним но: файлы в кодировке сp1251 автоматически при копировании конвертируются в koi8-r, что не допустимо. Данные файлы являются бинарными файлами с информацией используемой другим приложением.


так если это бинарные файлы, то какое вообще отношение имеет к нему кодировки?



Другие текстовые файлы созданные вручную с кодировкой cp1251, под такую проблему не попадают и копируются нормально.

а не вручную - это как ?



Результат тот же. При копировании в новых файлах конвертированное содержимое, но если использовать последние два варианта в чистом коде без Qt копирование происходит нормально.


кто на ком стоял?


Собственно вопрос: что происходит? Каким образом Qt может влиять на кодировку вплоть до использования fopen(...) и как это обойти в коде?

не может он ни на что влиять...

ну, если копировать с помощью QT, то там могут использоваться или нет BOM, но в конце концов можно копировать файлы как бинарные, через байтовый буфер.

в любом случае, без кода обсуждать что бесполезно, нужны исходники.
...
Рейтинг: 0 / 0
20.07.2017, 22:47
    #39492701
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
авторну, помимо всех сказок, код-то неверный.
fgets возвращает int, а не char, и EOF имеет тип int.

Простите что? fgets я не использую. И прототип функции fgets выглядит по другому.
То что при написании я задал тип char для ch это да. Ошибся когда писал сообщение, естественно туда нужен int, но дефакто это будет влиять только на обработку EOF.

Код: plaintext
1.
2.
char * fgets ( char * str, int num, FILE * stream );
int fgetc ( FILE * stream );



И что же вы имеете ввиду под "сказками"? Может как-то обоснуете свои "заявления"?
...
Рейтинг: 0 / 0
20.07.2017, 22:50
    #39492704
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleo,

Я описАлся, fgetc
...
Рейтинг: 0 / 0
20.07.2017, 22:58
    #39492712
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleoИ что же вы имеете ввиду под "сказками"? Может как-то обоснуете свои "заявления"?


Я в общем все уже написал.

1) ничего никуда само конвертироваться не может.
2) QT на это никак не влияет
3) ну и так далее.

Код код код, нужен код, который воспроизводит проблему.
...
Рейтинг: 0 / 0
20.07.2017, 23:18
    #39492723
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
вот тут есть хорошие примеры кода для м копирования файла, можешь взять любой.
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

файлы открывай только как бинарные и копией как бинарные.
...
Рейтинг: 0 / 0
20.07.2017, 23:19
    #39492724
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
MasterZiv,

автортак если это бинарные файлы, то какое вообще отношение имеет к нему кодировки?
ну наверно разработчики этих файлов решили их так кодировать, что строковые значения можно спокойно добыть из файла любым редактором, а сами строки хранятся в cp1251.

автора не вручную - это как ?
Получены со стороны. А вручную означало, что были сделаны тестовые файлы руками. Естественно они не равны по содержимому тем которые пришли изначально.

авторкто на ком стоял?
Если написать простое приложение без использование Qt, то результат копирования нормальный.

авторне может он ни на что влиять...
Ок! Тогда почему при копировании файла file1 весом 2740 байт, я получаю файл file2 весом 5308 байт? Используется QFile::copy(file1, file2).

авторКод код код, нужен код, который воспроизводит проблему.
Весь код в первом сообщении, если не брать в расчёт имён файлов и методов открытия файлов.

И всё же ещё раз повторюсь. Изначально копируется файл методом:
Код: plaintext
1.
static bool QFile::copy(const QString&in, const QString &out)


На входе файл весом 2740, на выходе копия весом 5308. При анализе содержимого получено файла выявлено, что все текстовые строки закодированные через cp1251 были перекодированы в koi8-r.
...
Рейтинг: 0 / 0
20.07.2017, 23:25
    #39492726
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleoНа входе файл весом 2740, на выходе копия весом 5308. При анализе содержимого получено файла выявлено, что все текстовые строки закодированные через cp1251 были перекодированы в koi8-r.


ну если у тебя размер файла меняется, значит где-то ошибка, логично?

даже если что то у тебя перекодирует из cp1251 в koi8-r, это все однобайтовые кодировки, размер не должен увеличиваться. логично?
...
Рейтинг: 0 / 0
20.07.2017, 23:25
    #39492727
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
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 с точностью до имён переменных.
...
Рейтинг: 0 / 0
20.07.2017, 23:34
    #39492728
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
MasterZiv,

авторну если у тебя размер файла меняется, значит где-то ошибка, логично?
даже если что то у тебя перекодирует из cp1251 в koi8-r, это все однобайтовые кодировки, размер не должен увеличиваться. логично?


Это мне самому понятно, но факт остаётся фактом. В Qt'ом исполнении копирования файлы получаются не те.
Ну а про размер я не знаю что и думать. Если только Qt конвертирует cp1251 -> utf -> koi8r с оибками при копировании. Но это точно бред.
...
Рейтинг: 0 / 0
21.07.2017, 09:01
    #39492768
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
heleo,

Сделай небольшой проектик на QT с кодом, который бы демонстрировал проблему.
Код пришли сюда.

Также на работе я посмотрю код этого QFile::copy.

Можно было бы предположить, что QT меняет настройки локейла в CRT, но если ты будешь копировать файл как бинарный,
а не как текстовый (не используя чтение в и запись из строки), настройки локейлов не используются.

Так что пока похоже на проблемы неправильного понимания ситуации, неверной диагностики проблемы и пр.
Т.е. либо у тебя где-то что-то делается, чего ты не знаешь, либо ты почему-то думаешь, что кодировка в файлах меняется, но реально она не меняется. Хотя у тебя ещё и размеры файлов меняются -- это вряд ли можно ошибочно интерпретировать.
...
Рейтинг: 0 / 0
21.07.2017, 12:47
    #39492929
heleo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
MasterZiv,

Спасибо, уже не нужно. Ошибка действительно не в копировании. Далее по коду вызывается стороннее АПи для чтения файлов. В новой версии АПИ оно само втихую их конвертит даже при чтении. Пока файлы не копировались они были защищены от записи учёткой root, при этом их обработка была нормальная. Ну и в доках к АПИ про такое поведение как всегда пусто. Так что можно тему закрывать.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]