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

Имеется:
ОС 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
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492686
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heleoРабочая кодировка ОС: koi8-r

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

LANG=ru_RU.KOI8-R

Если бы я написал не "рабочая кодировка ОС", а "системная локаль" Вам было бы понятнее?
...
Рейтинг: 0 / 0
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492694
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492696
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё прекрасно копируется за одним но: файлы в кодировке сp1251 автоматически при копировании конвертируются в koi8-r, что не допустимо. Данные файлы являются бинарными файлами с информацией используемой другим приложением.


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



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

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



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


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


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

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

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

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

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


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

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

Код код код, нужен код, который воспроизводит проблему.
...
Рейтинг: 0 / 0
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492723
Фотография 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

файлы открывай только как бинарные и копией как бинарные.
...
Рейтинг: 0 / 0
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492724
heleo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Qt 4 проблема с автоматическим конвертироавнием содержимого при копировнии файлов
    #39492726
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heleoНа входе файл весом 2740, на выходе копия весом 5308. При анализе содержимого получено файла выявлено, что все текстовые строки закодированные через cp1251 были перекодированы в koi8-r.


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

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

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


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

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

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

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

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

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


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