|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||||
Вывод информации в файл, Кириллица корректно не выводится23.09.2022, 06:43. Показов 7682. Ответов 81
Метки нет (Все метки)
Здравствуйте! Решил вывести информацию в файл по нажатии на кнопку "сохранить", но в файл отображается либо кракозябры, либо ничего, если текст на русском.
Вот код той части кода, которая должна выполнить задуманное: Кликните здесь для просмотра всего текста
Если честно, то я иссяк и хоть это не так важно на данный момент - я про вывод информации в файл, но, думаю, что лишним подобные знания не будут. В чём мой косяк? По идее должно выводить без проблем. Считывая строку из элемента управления "edit" в каком формате ANSII или UNICODE она попадает в буфер?
0
|
||||||
| 23.09.2022, 06:43 | |
|
Ответы с готовыми решениями:
81
Вывод информации - кириллица и латиница вместе
Ввод вывод в файл и консоль.(Кириллица) |
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
||||||||||||||
| 26.09.2022, 15:36 | ||||||||||||||
|
Впрочем, если хотите, можете привести хотя бы пару языков (кроме C# и подобных, разработанных изначально под винду, разумеется), которые следуют вашему шаблону. Напоминаю: под новые процессоры, контроллеры, ядра и прочее железо первым пишут именно компилятор Си, а вовсе не винду. Более того, ее даже на ARM портировать толком не могут. Полторы архитектуры железа, вот он ваш эталон претендента на стандарт! Так вот, если речь о разных процессах (все равно как если вы запустите несколько раз одновременно один и тот же экзешник), никакого конфликта не будет. А если о потоках, да еще на чистом strtok (без внешней переменной для хранения), уже будут проблемы. Для решения которых эту переменную собственно и ввели. В большинстве случаев об их существовании вы узнаете, когда начнете гуглить какую-нибудь специфичную проблему, а то и просто случайно. Либо при попытках закопаться вглубь системы. А изучать подобные вещи впрок почти бесполезно: их слишком много, без сколь-нибудь существенной практики (по сути - решения практической задачи) вы их толком не изучите, а потом еще и забудете. Поэтому просто занимайтесь тем, что вам интересно, или нужно в жизни и не теряйте любопытства. Я недавно писал GUI для скриптов на языке Lua для автоматизации работы с измерительными приборами. И в качестве виджетов взял именно gtk. Основная система на моей рабочей машине Linux, но проверял и на виндовых виртуалках. Как минимум до winXP вполне работает. При том, что я по сути не знаю ни winapi, ни X11/wayland (это линуксовый аналог winapi, но только для оконной системы, именно поверх него тот же gtk работает). Разумеется, не без косяков, но так это по сути мой первый проект с более-менее нормальным GUI. Да, Замабувараев, я довольно много пишу на Си как под ПК, так и под МК, а вот с гуйней столкнулся впервые. Демки на SDL+OpenGL не в счет, GUI там по сути нет. Большая часть реальных задач гораздо проще решается в консоли или с минимальным использованием графики. И нет, вопрос следования стандартам практически не спорный. Стандарты для того и нужны. А замыкаясь в узкой нише вроде того же winapi, вы серьезно ограничиваете себе как кругозор, так и возможность роста. Отдельно отмечу, что если вы хотите стать именно специалистом по ядру винды, тогда да, надо изучать именно его. Равно как специалист-эмбеддер будет изучать именно архитектуру контроллеров, а программист-трехмерщик возможности видеокарт и устройство графических библиотек. Но из ваших сообщений я могу предположить, что вы только знакомитесь с программированием, и не определились со специализацией. А в таком случае стоит изучить всего понемногу. ![]() Жаль только, винда в юникод за столько лет так толком и не научилась... Такое ощущение, что при написании софта под винду проще сразу писать свои реализации ввода-вывода, чем пытаться допилить те, что есть.
0
|
||||||||||||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||||||||
| 27.09.2022, 12:11 [ТС] | ||||||||||
|
Без понятия! Одна и та же строка буде разложена дважды, зачем, производительность?
0
|
||||||||||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
||||||||||||||||||||||||||||||||||||||||||||
| 27.09.2022, 17:28 | ||||||||||||||||||||||||||||||||||||||||||||
Кстати, когда я подобным образом отображал результаты моделирования для конференции, помимо собственно рисования сделал вывод в кучу bmp'шек, благо формат простой. Помню, в школе нам рассказывали про BorlandPascal, а я на нем делал примитивный графический редактор. Даже картинку какую-то нарисовал... и только потом сообразил, что не написал функцию сохранения.
0
|
||||||||||||||||||||||||||||||||||||||||||||
|
COM‐пропагандист
|
||
| 27.09.2022, 18:36 | ||
|
А вы вынуждены бороться и воевать с этой библиотекой, вставляя костыли. Смех.
0
|
||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
|||
| 27.09.2022, 20:01 | |||
|
Вот в каком-нибудь Питоне - пожалуйста. Собственно, там даже кодировка динамически выбирается: ascii -> utf-16 -> utf-32 в зависимости от символов в строке.
0
|
|||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||||
| 28.09.2022, 11:50 [ТС] | ||||||
, спрашиваю, а вы мне про библиотеки, я знаю, что можно, много чего можно, но не нужно мне сейчас про библиотеки я ими не пользуюсь(на данный момент). Серьёзных задач не решаю, проф. программистом не являюсь, хочу вникнуть в то, что сейчас изучаю.![]()
0
|
||||||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
|||||
| 28.09.2022, 17:19 | |||||
|
0
|
|||||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||||||||||||||
| 29.09.2022, 06:30 [ТС] | ||||||||||||||||
|
Если всё же, говорить о потоках, то сначала отработать должен один поток, а затем второй, иначе, выдаются неправильные результаты, значит, чтобы два потока отработали параллельно нужно чтобы каждый поток имел свой набор обрабатываемых данных. Кликните здесь для просмотра всего текста
![]() ? Вот такой вопрос:
Смущает формулировка "при любых изменениях размеров окна.", что тут имеется ввиду никак не пойму, возможно, вообще нужно вывести одну строку по диагонали). Тексты бывают разных размеров, как можно изменять размеры окна и при этом текст должен помещаться в окне да ещё и без полос прокрутки, о них тут не слова, хорошо, изменил размер шрифта, но есть предел размера как в большую так и в меньшую сторону. Что делать, как быть... На данный момент я сделал следующее: Кликните здесь для просмотра всего текста
0
|
||||||||||||||||
|
COM‐пропагандист
|
||
| 29.09.2022, 08:38 | ||
|
Стандартная библиотека все эти тонкости должна скрывать и предоставлять единый интерфейс в виде функции print. Вам не надо знать в какие регистры класть указатели на строку и в какой последовательности помещать параметры в стэк. Вам нужно просто вызвать print и стандартная библиотека сделает это за вас. И если формат си‐строк не соответствует родным строкам в ОС, то стандартная библиотека должна их конвертировать, чтобы обеспечить единый интерфейс. Грош цена стандартной библиотеке, которая это не умеет.
0
|
||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
|||||||||||||||
| 29.09.2022, 10:48 | |||||||||||||||
|
Кликните здесь для просмотра всего текста
Вот для этого последний аргумент и используется - для буферизации входной строки между вызовами. Так что да, это вопрос привычки и собственно задачи. И я вас ни в коем случае не отговариваю что-либо изучать. Напротив, умение собрать хотя бы примитивный GUI на чистом winapi без сторонних библиотек бывает полезно. Но по формулировке могу предположить совершенно практическую расшифровку - чтобы текст всегда помещался в окне и был читаем. То есть разбиение на несколько строчек, в том числе когда вы хватаете окно за угол и начинаете его ресайзить. И скорее всего, в winapi какой-то стандартный способ для этого есть. Изменение размера шрифта вряд ли. Это чит, и я плохо представляю, где бы это пригодилось в реальной жизни. Причем я могу понять и оправдать костыли вроде SetConsoleCP: при наличии нескольких кодировок узнать правильную ему больше неоткуда. Туда же isatty: если вывод идет на терминал, можно узнать его размер, работать с цветами, рисовать псевдографику. Но вот преобразовывать нажатия на клавиатуре в коды символов в заданной кодировке и наоборот, зная кодировку рисовать символы именно в соответствии с ней - задача именно терминала. Кстати, Liss29, тоже интересный пример упражнения - реализация терминала. Ведь как работает эмулятор терминала. Это окно в графическом окружении. Оно умеет обрабатывать нажатия клавиш - букв, цифр, стрелочек, функциональных - и переводить сканкоды в символы заданной кодировки*. Дальше эти символы собираются в строку: мы ведь можем ее редактировать, пока не нажали энтер. Перемещение курсора, делет, бэкспейс, копирование-вставка и все такое. Всем этим занимается именно терминал, а не юзерская программа**. Когда строка сформирована, она передается на stdin юзерской программы. Одновременно с stdout и stderr читается ее вывод и отображается в окне терминала. Плюс терминал может обрабатывать управляющие клавиши вроде ctrl+C, ctrl+Z и подобных. . Придется освоить оконный ввод, и главное - вывод. Редактирование строк (само по себе непросто). Запуск сторонних программ и подмена stdin/stdout/stderr на собственные. Неблокирующий ввод-вывод (пока мы ждем ввода от программы, обработка оконных событий прекращаться не должна). Возможно, кодировки (но явно не приоритет). В общем, довольно сложная задача. . *Первые терминалы, которые были именно терминалами - отдельными устройствами из принтера и клавиатуры и подключавшимися к компьютеру по COM-порту - скорее всего знали только одну кодировку, намертво зашитую в память. Поэтому если бы упражнение по кодингу терминала делал я, на первом этапе ограничился бы единственной кодировкой ASCII или UTF-8 в зависимости от графической библиотеки. Собственно, я точно не знаю, как задать кодировку в современных эмуляторах терминала - в этом просто нет нужды, везде utf-8, в крайнем случае iconv поможет. В виндовом, очевидно, SetConsoleCP и подобные. Можно еще попробовать читать переменную окружения LOCALE, но это уже извращение. ** Есть еще так называемый "неканоничный режим", когда коды передаются непосредственно в юзерскую программу без отображения на экране и ожидания энтера. Тот же _getch() примерно так работает. Но для первой версии оно явно не нужно. Логично решить эту проблему один раз при разработке ОС/терминала, чем раз за разом при написании каждой утилиты.
0
|
|||||||||||||||
|
COM‐пропагандист
|
||
| 29.09.2022, 18:22 | ||
|
0
|
||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
|||
| 29.09.2022, 18:49 | |||
|
Переменные вроде $LOCALE кто придумал? Для чего их придумали, как думаете?
0
|
|||
|
COM‐пропагандист
|
||
| 30.09.2022, 14:34 | ||
|
0
|
||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
||
| 30.09.2022, 15:46 | ||
|
Так что ваша претензия на самом деле к разработчикам виндовой консоли, которая стандарты не поддерживает.
0
|
||
|
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
|
||||||
| 01.10.2022, 05:30 [ТС] | ||||||
|
0
|
||||||
|
COM‐пропагандист
|
||
| 01.10.2022, 08:02 | ||
|
Любая строка должна иметь формат и определённое устройство. Это же не какой‐то сырой набор байт, который выводится в поток совершенно другой функцией. Для вывода строк на консоль есть специальные функции, которые работают со строками. Поэтому когда библиотека выводит строку на консоль, она использует функции вывода строки. И строку для таких функций следует подавать в родном для ОС формате, и библиотека должна преобразовать формат си‐строк в родной формат строк для ОС. По факту это уже происходит. Например, функция WriteConsole ориентируется не на нулевой символ, как это принято в си, а на длину, которую указывают отдельным параметром. Стандартная библиотека вычисляет длину строки и отправляет её в функцию WriteConsole. Первый шаг сделан. Осталось сделать второй шаг и научить разработчиков библиотеки, что выводить строки можно в юникоде.
0
|
||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
||||||||||||||||
| 01.10.2022, 10:50 | ||||||||||||||||
|
Вторая интерпретация, практическая: аналог блокнота, когда фиксированы и ширина, и высота, но можно добавить полосы прокрутки. Третья интерпретация, учебная: фиксированы ширина и высота, но можно менять шрифт так, чтобы текст всегда заполнял все окно. Если же хотите решить задачу "честно", должны быть функции расчета размера реднера строки. В том же gtk есть функция cairo_text_extents(intr, str, &sizes);, которая для строки str, выводимой ранее указанным шрифтом, считает размеры. В SDL подобным занимаются TTF_SizeText, TTF_SizeUTF8 (font, string, &w, &h);. По идее, подобное должно быть и в других шрифтовых библиотеках.Но это низкий уровень. Если ваше упражнение рассчитано на использование стандартных виджетов, надо именно их как-то настраивать. Может, у label есть функция автопереноса, может у поля текстового ввода. Как я говорил раньше, с winapi помочь смогу немногим. Если перенаправить ввод-вывод на обычные файлы, проблем нет. Значит, разработчики про юникод в курсе, и корректно реализовали. Получается, проблема именно в виндовой консоли. Не поленился, проверил на виртуалке с winXP. Кстати, нашел забавный костыль для вайна. Вероятно, он старательно эмулирует баги виндового терминала, но получается это плохо. Но можно вызвать программу так: cat | wine a.exe | cat, тогда ввод-вывод по сути пробрасывается из виндового терминала в нормальный, и проблем с юникодом не возникает.Код примера:
0
|
||||||||||||||||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
|
| 01.10.2022, 12:49 | |
|
UPD: ого, а в msys2 это работает. Видать, добавили под капотом проверку выходного потока и костыли для обхода багов виндовой консоли.
Замабувараев, видите, сторонние разработчики вынуждены изворачиваться странным образом только чтобы программа в винде работала так, как ожидалось.
0
|
|
|
COM‐пропагандист
|
||||||||
| 01.10.2022, 21:10 | ||||||||
|
Когда взяли нормальную, то всё заработало. Так что проблема не в винде. Добавлено через 7 минут
0
|
||||||||
|
4148 / 2726 / 433
Регистрация: 09.09.2017
Сообщений: 12,080
|
||||
| 01.10.2022, 21:28 | ||||
|
Сколько можно повторять: не перекладывайте работу разработчиков консоли на прикладных программистов. Если бы вы умели читать, то увидели бы пример, который я нашел для wine'а: cat | wine a.exe | cat и про аналог которого спрашивал. Но вы не умеете, поэтому приводите какие-то совершенно левые примеры.
0
|
||||
| 01.10.2022, 21:28 | |
|
Кодировка , кириллица не корректно отображается Не выводится кириллица Не выводится кириллица из БД Не выводится кириллица в консоль Кириллица выводится некорректно Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Жара жесть.
kumehtar 18.08.2026
Пролетают летом дни
Тридцать пять жары в тени.
Каждый август год от года
Дарит жаркую погоду.
|
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
|
Лето уходит
kumehtar 17.08.2026
|
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
|
|
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины".
За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html
Задача: . . .
|
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
|
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет:
1. Использовать системное время и дату,
2. Есть возможность вводить время и дату вручную.
3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
|
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber.
Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
|