|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
Почему-то не читается содержимое файла в OEM 866 на других компах, кроме моего03.10.2016, 19:28. Показов 3896. Ответов 36
Всем привет!
Я написал программку по считыванию файла в формате OEM 866 и выводе определенных строк в консоль. На моих компьютерах все работает отлично, однако на других компьютерах содержимое файла попросту не читается, но при этом сам файл открывается без проблем (добавил функцию проверки is_open). Разница между компьютерами в установленном GCC. Подскажите, пожалуйста, какие библиотеки нужно добавить, дабы все читалось без проблем без установки GCC? На данный момент в проекте есть libgcc_s_dw2-1.dll и libstdc++-6.dll. Заметка, программа читает нормально файлы в кодировке Windows 1251 на любых компах.
0
|
|
| 03.10.2016, 19:28 | |
|
Ответы с готовыми решениями:
36
Программа не работает на всех компах кроме моего В папке Сеть 11 других компьютеров кроме моего Вывод текста в кодировке Win-1251 из bat-файла, текст которого в кодировке OEM-866 |
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||
| 04.10.2016, 23:25 | ||
|
Добавлено через 3 минуты Чтобы время сократить, нужно заодно ещё такое проверить. Если будет выводить считанное, то значит не находит в считанном. Тогда нужно проверить, как выводится на консоль текст из кода, и как он выглядит на консоли после функции CharToOem().
0
|
||
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
||||||
| 04.10.2016, 23:33 [ТС] | ||||||
|
Там где не работает, не прописан путь и никогда не стоял никакой компилятор это точно.
Добавлено через 7 минут T.e.
Или что ты имеешь ввиду?
0
|
||||||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|||||||
| 04.10.2016, 23:36 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
| 04.10.2016, 23:42 [ТС] | |
|
Ок, спасибо. Тот код тоже работал. Завтра напишу, как что вышло.
Еще я поставил версию Release и убрал все опции флаги, кроме: [-O2], [-s] во флагах компилятора.
0
|
|
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
||
| 05.10.2016, 06:16 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
||||||
| 05.10.2016, 15:25 [ТС] | ||||||
|
Короч, затестили. Все строчки читаются, однако, все равно не находит. Строчка с OEM не выходит, char выходит, но кракозябрами. Т.е.
Второй попросту нет. Самое интересное, что у него кракозябры на месте русского. У меня на компе первая строка кракозябры, остальное, что в OEM нормально отображается. Еще одно. Проверил на еще одном компе, где опять же ничего не ставилось и проги никогда не было, и оно работает! Видимо, скорее всего, проблема в настройке системы или что-то типа того. От чего это может зависеть?
0
|
||||||
|
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
|
|
| 05.10.2016, 15:46 | |
|
0
|
|
|
Ушел с форума
|
||
| 05.10.2016, 15:57 | ||
Сообщение было отмечено FrankieRafie как решение
Решениекодировку консоли, совместимую с текстовым режимом (т.е. из ANSI в OEM, если простым языком). Проблема в том, что в зависимости от локализации системы и ее региональных настроек эти кодировки могут различаться. Например, на русских Виндах, а также там, где для программ, не поддерживающих Unicode, установлен русский язык, системной кодировкой является CP-1251 (кириллица). Но на английских Виндах там уже CP-1252. OEM-кодировки тоже различаются, для русского языка там OEM866, для английского другая (какая - сейчас не вспомню). Когда ты запускаешь свою программу на английской, например, Винде, то CharToOemA "думает", что на вход ей подают CP-1252, а на самом деле там CP-1251, вот и получаем "кракозябры", не работающие функции поиска подстроки и т.п.
1
|
||
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
| 05.10.2016, 17:03 [ТС] | |
|
Проблема в том, что я проверял и компилировал на русской Windows 10 64. Там все без проблем. У меня на работе Windows 7 64 английская и данная функция работает. У коллеги точно такая же Винда и все работает. А у 2-ух других коллег опять же такая винда, но не работает.
Скрины сейчас скину. Добавлено через 19 минут Фото с компа, где не работает. Английская Windows 7 64 bit Фото с работающего. Английская Windows 7 64 bit
0
|
|
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 05.10.2016, 17:17 | |
|
Видно, что там даже шрифт другой. Выясни уже в какой кодировке консоль работает там и там. Команда chcp. И шрифты посмотри какие выбраны.
Что считается Char, а что OEM тоже надо проверить.
1
|
|
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
| 05.10.2016, 18:21 [ТС] | |
|
У меня 866, где не работает 437.
0
|
|
|
Ушел с форума
|
||
| 05.10.2016, 18:46 | ||
|
стоять русский язык для программ, не поддерживающих юникод. В этом случае тоже все будет работать. А на "чистой" английской или другой некириллической локализации Windows твоя программа не будет работать нормально, пока ты ее не перепишешь на Unicode. Никакие "костыли" не помогут, только Unicode.
1
|
||
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
| 05.10.2016, 18:54 [ТС] | |
|
Всем спасибо! С локализациями помогло. Оказалось, что на компах, где работало, для не Unicode программ стояла локализация Russian, а где не работало, стояло English. При смене на Russian все действительно работает.
Если не сложно, подскажите, пожалуйста, как в будущем можно этого избежать, работая с файлами в кодировке OEM 866? Или же какую-нибудь статейку про работу с Unicode в C++.
0
|
|
|
Ушел с форума
|
||
| 05.10.2016, 21:49 | ||
Сообщение было отмечено DrOffset как решение
Решениетребуется для той или иной функции. Есть такой принцип: если у тебя есть строка, но ты не знаешь, в какой она кодировке, то можешь считать, что у тебя нет этой строки. Это проблема очень многих компонентов и программных интерфейсов, которые работают с текстом: они манипулируют так и сяк строками, но явно не оговаривают, в какой кодировке должны быть эти строки; иногда "подразумевается" UTF-8, иногда системная кодировка ANSI или еще какая-нибудь конкретная, но какая точно - никто не скажет... Отсюда и рождаются ошибки, подобные этой. А вот если бы мы точно знали, что текст в исходном файле в кодировке CP-1251, а для вывода нужна строго OEMCP, то можно было выполнить соответствующее преобразование с помощью MultiByteToWideChar и WideCharToMultiByte (сначала из CP-1251 в Unicode UTF-16, затем из него в OEMCP), либо одним из других подходящих способов (ICU, iconv и т.п.) и это работало бы на любой системе и на любых региональных настройках. В Windows есть три основных кодировки: * UTF-16 (Unicode) Основная рабочая кодировка Windows, появилась в Windows 2000 и с тех пор она используется практически всеми компонентами системы, включая ядро. Прелесть Unicode объяснять не нужно: один и тот же текст, не зависимо от локализации и региональных настроек системы, кодируется и выглядит везде одинаково. Кроме того, пространство Unicode очень большое, оно включает в себя символы и специальные знаки подавляющего большинства существующих алфавитов и письменностей, включая всякую для нас с вами экзотику, такую как иероглифы, арабский язык с письмом справа-налево и т.п. Только используя Unicode можно отобразить в одном предложении слова на разных языках (например, сообщение на немецком языке, которое содержит имя файла с иероглифами). * ANSI (системная кодировка) Кодировка для поддержки программ, которые не работают с Unicode. В зависимости от настроек и локализации системы, это может быть или CP-1251 (кириллица), или CP-1252 (латиница), или одна из множества других кодовых страниц. Беда в том, что текст, подразумевающий дефолтную кодировку ANSI, может прекрасно отображаться на одной системе и превращаться в "кракозябры" на другой. Типичный пример - MessageBoxA с текстом на русском языке, который отображается только на адаптированных под русский язык системах. У MessageBoxW такой проблемы нет, потому что она использует Unicode (W - от "Wide Char" или "Wide String", т.е. "широкие" символы). * OEM (системная кодировка консоли) Эта кодировка предназначена для использования консольными приложениями. Также, как и ANSI, конкретная кодировка зависит от локализации и региональных настроек системы. Русский - OEM-866, французский - OEM-863, греческий - OEM-737, и т.д. Минусы те же: текст в OEM-кодировке переносим только на те системы, которые умеют работать с ней. Например, чтобы заставить английскую Windows показать в консоли текст в OEM-866, потребуется целая серия очень хитрых "приседаний". Если нет каких-то других особых причин, я рекомендую всегда стараться использовать только Unicode, так как это на порядок снижает количество проблем, связанных с интернационализацией приложения. Собственно, интернационализация - это и есть переход на Unicode, его для того и придумали. При этом использование Unicode не освобождает тебя от ответственности все равно знать, в какой кодировке текст Потому что там может быть UTF-8, а можетUTF-16 или UTF-32, Big или Little Endian, с BOM или без... Конкретно у консоли в Windows есть еще один очень большой недостаток - для отображения текста в определенной кодировке нужно еще, чтобы был установлен "правильный" шрифт. Документированные способы программно найти и установить для консоли подходящий шрифт существуют только на последних версиях Windows и там все равно очень легко запутаться. Если ты не знаешь на 100%, как это сделать, то лучше всего использовать только символы латинского алфавита и работать с текстом в консоли только латиницей. С отображением латиницы точно уж проблем никаких не возникнет. Многие программы именно так и поступают.
1
|
||
|
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
|
|
| 05.10.2016, 21:50 | |
|
Ну просто перекодируешь содержимое файла из 866 в unicode при чтении.
Но консоль всё равно придётся настраивать - кодировку и шрифт. Добавлено через 54 секунды А почему не использовать нормальное приложение? Консоль так необходима?
0
|
|
|
0 / 0 / 0
Регистрация: 29.08.2016
Сообщений: 19
|
|
| 05.10.2016, 22:43 [ТС] | |
|
Спасибо за ответы.
Не использовал гуишки, так как не особо умею их писать, да и не требовалось. Пытался изучать Qt, но не смог найти нормальные гайды (видимо плохо искал). Писал программу на скорую руку для себя, дабы упростить себе работу с файлами и документами. Да и планирую специализироваться на других языках, но пока что располагаю лишь C++. Насчет OEM 866, у нас все файлы типа NetworkInfo в кодировке OEM 866. Потому я и не ожидал такой проблемы, в связи с неопытностью.
0
|
|
| 05.10.2016, 22:43 | |
|
Помогаю со студенческими работами здесь
37
На вижу мой сайт на своем компе, на других компах его видно. Почему? Перекодировка из OEM-866 в Windows-1251 Перекодировка текста из OEM 866 в UTF-8 или Ansi с загрузкой в Memo Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|