|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
||||||
Вывод информации в файл, Кириллица корректно не выводится23.09.2022, 06:43. Показов 7551. Ответов 81
Метки нет (Все метки)
Здравствуйте! Решил вывести информацию в файл по нажатии на кнопку "сохранить", но в файл отображается либо кракозябры, либо ничего, если текст на русском.
Вот код той части кода, которая должна выполнить задуманное: Кликните здесь для просмотра всего текста
Если честно, то я иссяк и хоть это не так важно на данный момент - я про вывод информации в файл, но, думаю, что лишним подобные знания не будут. В чём мой косяк? По идее должно выводить без проблем. Считывая строку из элемента управления "edit" в каком формате ANSII или UNICODE она попадает в буфер?
0
|
||||||
| 23.09.2022, 06:43 | |
|
Ответы с готовыми решениями:
81
Вывод информации - кириллица и латиница вместе
Ввод вывод в файл и консоль.(Кириллица) |
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
||||||||
| 24.09.2022, 13:35 [ТС] | ||||||||
0
|
||||||||
|
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
|
|||
| 24.09.2022, 14:31 | |||
|
0
|
|||
|
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
|
|||||||||||||
| 24.09.2022, 17:22 | |||||||||||||
|
Так что это не EmptyString, а "внутреннее представление для strtok" - ну например, strtok_internal_str. Кодировка будет выглядеть так:utf-8: D09AD0BED0B4D0B8D180D0BED0B2D0BAD0B0utf-16: 1A043E043404380440043E0432043A043004cp1251: CAEEE4E8F0EEE2EAE0866: 8AAEA4A8E0AEA2AAA0koi8-r: EBCFC4C9D2CFD7CBC1Вот так вывод вроде работает:
Другой вопрос, зачем вы сами изучаете winapi? Если для того, чтобы понять как работает именно винда, это одно, но если для написания пользовательских программ - совсем другое. Там как раз winapi не особо-то и нужно, тем более что есть куча более удобных кроссплатформенных средств.
0
|
|||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
||||||||||
| 25.09.2022, 06:58 [ТС] | ||||||||||
|
Добавлено через 22 минуты Хотя с графикой там по легче будет, тут спору нет, я имею ввиду разработку GUI. Вообще, видимо, мне больше низкоуровневое программирование нравится, не знаю почем, возможно, потому что начинал, точнее пытался начать разбираться в вопросе программирования с Ассемблера.
0
|
||||||||||
|
фрилансер
6495 / 5723 / 1133
Регистрация: 11.10.2019
Сообщений: 15,285
|
|
| 25.09.2022, 07:01 | |
|
Liss29, внутри программы на винде (для удобства работы со строками) все тексты храни/используй в кодировке utf16 (wchar_t, std::wstring, anyWinAPIfuncW)
а в файлы/txt/ini/json/xml/БД советую сохранять в utf8, так как это практически стандарт
1
|
|
|
COM‐пропагандист
|
||
| 25.09.2022, 08:49 | ||
|
0
|
||
|
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
|
||||||||
| 25.09.2022, 09:21 | ||||||||
|
Я, например, воткнулся, когда хотел сделать неблокирующий канал, то есть такую штуку для общения двух потоков друг с другом, что один туда пишет, второй читает. Но если канал переполнен, то первый не ждет до посинения, а получает ошибку "канал переполнен", и наоборот, если там пусто, второй не ждет, а также получает ошибку. В линуксе это получилось элементарно, а вот корректного способа через winapi я так и не нашел, пришлось городить костыли через общую память и атомики. Знание принципов работы операционки, безусловно, полезно, но если вы не собираетесь упарываться в системное программирование (те же оболочки, драйвера, ядро ОС), то и слишком глубоко копать тоже не нужно. Ну например, можете попробовать реализовать оконное приложение с кнопками, полями ввода и прочим сначала на чистом winapi, а потом на каком-нибудь gtk. И я рекомендую сделать это не столько ради сравнения усилий, сколько ради именно понимания как winapi работает с окнами. Дескрипторы окон, цикл обработки событий, wParam, lParam и все такое. gtk это все скрывает, там объектная модель (даром что на Си написан). Для примера, чтобы узнать загрузку процессора достаточно прочитать текстовый файл /proc/stat и поколдовать над чиселками. Аналогично для оперативки /proc/meminfo. В winapi для каждого действия своя специальная функция - GetSystemTimes и GlobalMemoryStatusEx.scanf("%s%s%i", str1, str2, num);. Если хочется защититься от переполнения буфера, scanf("%100s%100s%i, str1, str2, num);. Это работает для utf-8. Если хочется utf-32, то аналогичноwscanf(L"%100ls%100ls%i", str1, str2, num);. Еще у scanf есть шаблоны, но оставим их пока.Так вот, как мне сделать нечто подобное в виндовой консоли?
0
|
||||||||
|
COM‐пропагандист
|
||
| 25.09.2022, 09:47 | ||
|
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
|||||||
| 25.09.2022, 11:34 [ТС] | |||||||
|
0
|
|||||||
|
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
|
|||||||||
| 25.09.2022, 12:27 | |||||||||
|
Другое дело, что могут использоваться более полезные извращения вроде макросов локализации. Вот это, в отличие от TEXT, действительно полезная штука, хотя и явно не для начинающих. Собственно, полезной она становится только когда программой пользуются люди из разных стран. . Но вы бы лучше пример ввода юникода показали. Правда, мне не нравится ваш термин "поток прерван": на современных системах несколько потоков могут выполняться абсолютно одновременно. Но даже когда используется переключение контекстов, оно случается когда само захочет. Скажем, в первом потоке вы скормили strtok'у какую-то строку, он ее пожевал... и тут срабатывает переключение потоков, где второй тоже хочет разложить строку. То есть результат может оказаться любой! В худшем случае они отработают последовательно и без спецэффектов (надеюсь, догадаетесь, почему этот случай - худший). А могут и перемешать токены из разных строк. Хотя, конечно, низкоуровневая работа с памятью тоже возможна и позволяет проворачивать хитрые штуки. Например, линуксовый mmap отображает файл на память. То есть вы работаете с содержимым файла как с обычным массивом в обход всяких fread, fscanf и подобных. Но это опять же экзотика, и надо четко понимать зачем оно нужно и какие ограничения. gcc main.c не ахти какое сложное заклинание.Ну и лично мне подобный способ (набивать код в обычном редакторе и собирать из консоли) нравится больше. Особенно для задач-пятиминуток, как на том же форуме.
0
|
|||||||||
|
COM‐пропагандист
|
|
| 25.09.2022, 13:46 | |
|
0
|
|
|
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
|
||
| 25.09.2022, 13:56 | ||
|
0
|
||
|
COM‐пропагандист
|
|||||||
| 25.09.2022, 14:52 | |||||||
|
Вот пример программы, которая делает это без всяких стандартных библиотек:
0
|
|||||||
|
336 / 129 / 18
Регистрация: 26.12.2010
Сообщений: 501
|
||
| 25.09.2022, 18:20 | ||
|
Замабувараев, scanf работает по типу printf, только наоборот. Т.е. читает ввод пользователя и записывает в переменные, исходя из спецификаторов (число, строка, еще что-нибудь).
0
|
||
|
COM‐пропагандист
|
||
| 25.09.2022, 18:40 | ||
|
0
|
||
|
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
|
|||||||
| 25.09.2022, 21:03 | |||||||
|
Я всего лишь уточнил, что в winapi человеческий способ не работает, нужны костыли. Вы же сами их и описали. ![]() Она не по пробелам разбивает, а ищет входжение подстрок по шаблону, причем если шаблон не соответствует строке, ввод прекращается, и функция возвращает ошибку. Например: Шаблон "%i", строка "123e45" -> считает 123, а "e45" останется в потоке Шаблон "%[a-z]", строка "SomeText123" считает "SomeText", а "123" оставит Шаблон "%i%c", строка "123 456" считает 123 и пробел, а "456" оставит Шаблон "%iabc%i", строка "123abcd45" считает 123, а "d45" оставит и вернет ошибку В общем, лучше ознакомьтесь с документацией.
0
|
|||||||
|
COM‐пропагандист
|
|||||||||
| 26.09.2022, 03:34 | |||||||||
|
В вашем варианте со scanf всегда приходится извращаться либо с SetConsoleCP, либо с system("chcp 1251"), либо setlocate(LC_ALL, "RUSSIAN") и прочей нестандартной ерундой. Вторая проблема SetConsoleCP, что после её вызова всегда забывают вернуть кодовую страницу взад, и ежели программу запускали в пакетном режиме, то это сбивает всю дальнейшую кодировку. Я предпочитаю вызывать функции ОС напрямую, потому что они работают без костылей, без изменений кодовых страниц и без «смены шрифта в консоли». Терминал управляется текстовыми последовательностями. Консоль управляется через богатый набор функций. Добавлено через 3 минуты В вашем варианте со scanf всегда приходится извращаться либо с SetConsoleCP, либо с system("chcp 1251"), либо setlocate(LC_ALL, "RUSSIAN") и прочей нестандартной ерундой. Вторая проблема SetConsoleCP, что после её вызова всегда забывают вернуть кодовую страницу взад, и ежели программу запускали в пакетном режиме, то это сбивает всю дальнейшую кодировку. Я предпочитаю вызывать функции ОС напрямую, потому что они работают без костылей, без изменений кодовых страниц и без «смены шрифта в консоли». Терминал управляется текстовыми последовательностями. Консоль управляется через богатый набор функций.
1
|
|||||||||
|
4070 / 2704 / 433
Регистрация: 09.09.2017
Сообщений: 12,023
|
||||||||
| 26.09.2022, 10:30 | ||||||||
|
С чего вы вообще взяли, что они должны подстраиваться под косяки winapi? В цивилизованном мире давным-давно используется utf-8, и большая часть стандартных функций с ним работает вообще без модификаций. Не говоря уж о том, что выбор utf-16 иначе как идиотизмом назвать не получается: он и места занимает больше utf-8, и все равно остается многобайтным. Нормальный wchar_t (который utf-32) хотя бы кодирует одну букву одним символом. В более дружелюбных ОС ничего подобного не требуется, оно просто работает. --- TLDR: не перекладывайте ответственность за виндовые косяки на окружающих. Есть стандарт языка, которому все следуют. Есть соглашения вроде utf-8 представления для юникода, которым все следуют.
0
|
||||||||
|
COM‐пропагандист
|
|
| 26.09.2022, 11:22 | |
|
Сишник думает, что Си — это единственный язык программирования из пяти тысяч созданных, и ОС должна подстраиваться под какую‐то там библиотеку языка Си из 1973 года, игнорируя все современные интерфейсы, железо и парадигмы разработки.
На самом деле это библиотека Си должна подстраиваться под ОС и скрывать детали реализации. Печально, что разработчики библиотеки за 30 лет этого не поняли. Я понимаю, что для сишников в принципе нормально дискриминировать любые функции, которые не находятся в стандартной библиотеке. Но если так делать, то много чего исчезнет, например, сетевое программирование, которое ни в каком стандарте языка Си не описано.
0
|
|
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,633
|
||||||||||
| 26.09.2022, 12:57 [ТС] | ||||||||||
|
0
|
||||||||||
| 26.09.2022, 12:57 | |
|
Кодировка , кириллица не корректно отображается Не выводится кириллица Не выводится кириллица из БД Не выводится кириллица в консоль Кириллица выводится некорректно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|
|
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу)))
Критические ошибки, мешающие компиляции и. . .
|
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата)
Этот документ предназначен для того, чтобы новый чат Claude мог продолжить
работу без необходимости заново разбираться в. . .
|
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса
Калибровка параметров симбиотической модели: технический обзор
Содержание:
Введение
Постановка проблемы
Технические аспекты реализации
Процесс внедрения изменений
|
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0»
https:/ / ibb. co/ NnkGpfMd
Представленная интегрированная схема описывает непрерывную нелинейную. . .
|