Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/30: Рейтинг темы: голосов - 30, средняя оценка - 4.67
1 / 1 / 4
Регистрация: 23.09.2014
Сообщений: 11

Записать информацию в файл в нужной кодировке

23.09.2014, 11:52. Показов 7062. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется строка типа wchar_t, нужно записать её в текстовый файл, чтобы можно было открыть его блокнотом и всё читалось без кракозябр. Лучше перевести строку из wchar в string. подскажите функцию, и как ей пользоваться
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.09.2014, 11:52
Ответы с готовыми решениями:

Записать информацию в файл в правильной кодировке
Всем доброго дня !!! Пытаюсь в файл Vasa.txt записать Привет, Лопух! , а получаю ЏаЁўҐв, ‹®Їге! Подскажите пожалуйста в чем может...

Как записать файл в кодировке utf-8?
Вообщет задача такая, нужно файл записать в кодировке utf-8 или unicode и нужно чтобы русские символы считывались. Я хочу добиться чтобы...

Считывание из файла в нужной кодировке
Почему при считывание файла выдает кракозябры ? Содержимое файла: char *text; ifstream read; ...

31
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.09.2014, 00:49
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. я могу написать программу по тупому. Но я для себя не буду иметь "морального права" называть свою программу правильной и не буду других учить делать так же. А сам буду пользоваться подобным "моральным правом" только для того, чтобы сделать программу на коленке, которая не предполагает долго жить
Правильность нужна только в том случае, когда пишется кроссплатформенный код,
либо код с перспективами переноса на другие платформы. Во всех остальных
случаях такие заботы не нужны и приводят к переусложнению на пустом месте, а
также к растрачиванию времени, выделенного на разработку. IMHO.

Цитата Сообщение от Evg Посмотреть сообщение
Тот факт, что wchar_t на разных платформах имеет разный размер разве не наводит на размышления о том, что подобным образом написанная программа будет вести себя по разному?
Есть платформы, где нельзя использовать исключения, а int 16-битный.
Не считаю факт их существования в природе достаточным поводом, чтобы
отказываться от try/catch/throw и не писать "int a = 1000000".

С учётом того, что в винде wchar_t имеет ширину 16 бит, то там хранится не юникод, а кастрированный юникод, насколько я себе это представляю, хотя может быть там есть какие-то особенности для хранения символов с номерами больше 2^16
То, что ты описал - это UCS-2, а в Windows уже полтора десятка
лет используется самый что ни на есть UTF-16:

Surrogates and Supplementary Characters
http://msdn.microsoft.com/en-u... 85%29.aspx
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 11:05
Цитата Сообщение от Evg Посмотреть сообщение
Цитата Сообщение от zer0mail
Пишешь в файл сначала BOM, а потом wchar_t и блокнот без проблем открывает.
По большому счёту это кривой способ. Он будет работать под виндой только потому что звёзды стоят правильно (что wchar_t под виндой имеет размер 16 бит), а не потому, что так надо делать.
Он хоть где будет работать. При записи BOM определится порядок байтов (BE или LE) и разрядность (16/32), а блокнот после чтения BOM автоматически считает правильно остальную часть файла (он понимает и BE и LE и Utf-8). Суррогатные пары тоже правильно запишутся-прочитаются, хоть для Windows (LE), хоть для Linux (с 32-битным внутренним представлением), хоть для Unix (BE).

Добавлено через 3 минуты
Evg, насчет кастрированности почитайте хотя бы: http://zelserg.livejournal.com/2570.html
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.09.2014, 11:53
Цитата Сообщение от Убежденный Посмотреть сообщение
Правильность нужна только в том случае, когда пишется кроссплатформенный код,
либо код с перспективами переноса на другие платформы. Во всех остальных
случаях такие заботы не нужны и приводят к переусложнению на пустом месте, а
также к растрачиванию времени, выделенного на разработку. IMHO.
Не соглашусь с тобой. Чисто с педагогической точки зрения. Я считаю, что человеку сначала нужно научиться работать правильно, и только потом пытаться сокращать усилия на написание программы, пользуясь имеющимися в голове знаниями. Когда сразу же работаешь по сокращённому варианту, то в мозгу откладывается неверное представление об устройстве вещей. На работе мы уже много раз наступали на грабли с этим вопросом (о неправильном представлении вещей из-за работы в условиях частного случая) с молодыми сотрудниками. Собственно, мои возражения носили именно такой характер. Переносимость программ, вещь, конечно, нужная, но в теории её намного сложнее усвоить. Конкретно в данном теме возражения мои НЕ касались переносимости

Цитата Сообщение от Убежденный Посмотреть сообщение
То, что ты описал - это UCS-2, а в Windows уже полтора десятка
лет используется самый что ни на есть UTF-16
При хранении в памяти? Может я что-то не понимаю, но каким образом в ОДНОЙ переменной типа wchar_t хранить символ с номером больше 2^16? По моим представлениям wchar_t заводился именно для хранения данных в памяти и удобной их обработки. Т.е. конкретная кодировка (utf-8, utf-16, utf-32) используется для записи в файл, при передачи по сети и т.п., т.е. там, где критичен в первую очередь размер. А внутри программы используется такое представление, которое максимально удобное для обработки, отрезанное от конкретной кодировки. И именно для таких целей был реализован wchar_t. Т.е. если в файл записать широкую строку (wchar_t*) через fwprintf, настраиваясь на какую-нибудь конкретную кодировку (типа utf-16le), то результат получится одинаковым на любой машине (например, разницы на little endian и big endian не будет), а вот если через fprintf, то мы в файле получим образ того, что хранится в памяти, а потому на разных машинах можем получить разный результат.

Может я что-то не так понимаю с назначением типа wchar_t
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 11:56
Цитата Сообщение от Evg Посмотреть сообщение
каким образом в ОДНОЙ переменной типа wchar_t хранить символ с номером больше 2^16?
Почитайте про суррогатные пары
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.09.2014, 11:59
Цитата Сообщение от zer0mail Посмотреть сообщение
Он хоть где будет работать
Согласен, я был не прав

Я блокнотом много лет не пользуюсь, а потому как-то до сих пор считал, что он кроме win1251 никаких кодировок не понимает.

По части ссылки я не увидел для себя ничего полезного. По ходу дела я не совсем понимаю, как работают с wchar_t под виндой
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 11:59
Символы больше 2^16 хранятся в ДВУХ wchar_t (по ссылке даже написано, как)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.09.2014, 12:10
Цитата Сообщение от zer0mail Посмотреть сообщение
Почитайте про суррогатные пары
Что такое пара я понимаю. Я не понимаю идеологию такого построения. Нахрена нужно было создавать пары, ведь они ломают концепцию wchar_t как типа, удобного для обработки

Добавлено через 21 секунду
Цитата Сообщение от zer0mail Посмотреть сообщение
Символы больше 2^16 хранятся в ДВУХ wchar_t
Вот в этом я и не вижу логики

Добавлено через 2 минуты
Всякие суррогатные пары - это особенность конкретной кодировки utf-16le или utf-16be. Тип wchar_t по смыслу, как мне казалось, не должен быть привязан к устройству какой-либо конкретной кодировки. wchar_t - это тип для хранения unicode, а не его кодирования

Добавлено через 7 минут
Ну и изначальная моя претензия была основана на том, что если если массив wchar_t'ов записать в файл обычной функцией (которая работает с массивами байтов), то положение звёзд на небе определило бы то, что внутреннее представление wchar_t под виндой совпадает с кодировкой utf16-le и благодаря этому факту мы и получили бы файл в конкретной кодировке utf16-le
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 12:49
Боюсь, Вы невнимательно читали статью или не обдумывали прочитанное
Надо исходить не из концепции wchar_t, а из концепции unicode. Как бы Вы решили проблемы перехода расширения количества символов с ~65тыс до 1млн? Переписывать все программы или сделать так, чтобы те, кому новые символы не нужны [почти] не заметили перехода и могли пользоваться старыми программами?

Что касается wchar_t, то у Windows он был и есть 16 битов (он точно соответствовал 1-му варианту unicode, а теперь ему приходится использовать пары), а в Linux 32 бита ("внутри" ему не нужны пары). Наверное, Гейтс предпочел добавить и переделать несколько функций, а не ломать ядро и переписывать приложения (прикиньте, сколько их было к 1996 году) Особенно, если учесть, что эти расширения абсолютному большинству американцев и европейцев не нужны.

Добавлено через 5 минут
Кстати, массив wchar_t НЕ следует писать как массив байтов (хотя часто получается правильно). Пишите его как массив wchar_t, либо делайте явное преобразование в Utf16, Utf32 или utf8. Только надо не забыть записать в начале BOM и все будет корректно и будет читаться везде (собственно, это я и написал в своем первом сообщении темы, только кратко ).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.09.2014, 13:36
Цитата Сообщение от zer0mail Посмотреть сообщение
Надо исходить не из концепции wchar_t, а из концепции unicode
wchar_t, насколько я понимаю, придумали, чтобы работать с unicode. А вовсе не unicode придумали, чтобы было чем занять wchar_t

Цитата Сообщение от zer0mail Посмотреть сообщение
Как бы Вы решили проблемы перехода расширения количества символов с ~65тыс до 1млн? Переписывать все программы или сделать так, чтобы те, кому новые символы не нужны [почти] не заметили перехода и могли пользоваться старыми программами?
Лично я пошёл бы по пути через болезненный переход с 16-битного на 32-битный wchar_t. Опять-таки мой личный опыт говорит о том, что лучше один раз как следует напрячься, чтобы потом этим вопросом больше никогда не заморачиваться и об него больше не спотыкаться

Цитата Сообщение от zer0mail Посмотреть сообщение
он точно соответствовал 1-му варианту unicode
Цитата Сообщение от zer0mail Посмотреть сообщение
Наверное, Гейтс предпочел добавить и переделать несколько функций, а не ломать ядро и переписывать приложения
Да, скорее всего так и есть. Черезжопие (а на мой взгляд это именно черезжопие) возникло как последствие нежелания ломать старую концепцию, пользуясь тем, что за пределами 2^16 лежат статистически незначимые символы

Цитата Сообщение от zer0mail Посмотреть сообщение
Кстати, массив wchar_t НЕ следует писать как массив байтов <> Пишите его как массив wchar_t
Либо тут вопрос терминологии, либо мы говорим о разных вещах. Если исходить из "простых" интерфейсов типа printf/cout, то между двумя озвученными методами разницы нет

Добавлено через 4 минуты
А... про последнее понял. Там будет проблема с символом '\0'. ТОгда printf надо заменить на что-то, не работающее с Си'шным понятием строки (например, fwrite).

Правда теперь я не понимаю, что такое

Цитата Сообщение от zer0mail Посмотреть сообщение
Пишите его как массив wchar_t
а точнее, чем его писать. Если всякими типа fwprintf, то эти интерфейсы, насколько я понимаю, не просто пишут, а конвертируют в соответствие с настройками локали
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 16:27
Цитата Сообщение от Evg Посмотреть сообщение
а на мой взгляд это именно черезжопие)
Я думаю, что если бы поломали ядро и сказали программистам: переписывате ваши библиотеки, программы, конвертируйте базы данных, то это и было бы "черезжопие". А так обошлось "малой кровью" и многие программисты, администраторы баз данных (не говоря уж о пользователях) этого перехода не заметили.
Вы всерьез полагаете, что американцы в массе стали бы напрягать себя ради каких-то там иероглифов и прочей ерунды, о которой они не знают и знать не хотят и которой они не пользуются?

Добавлено через 22 минуты
Кроме всего прочего, понадобилось бы удвоить количество дисковой памяти при переходе utf16 - utf32 (а ради чего, спрашивается).
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
26.09.2014, 18:08
Цитата Сообщение от zer0mail Посмотреть сообщение
Вы всерьез полагаете, что американцы в массе стали бы напрягать себя ради каких-то там иероглифов и прочей ерунды, о которой они не знают и знать не хотят и которой они не пользуются?
Тем не менее, они напряглись при переходе от 8-битной к 16-битной кодировке. Тем более они постоянно орут про демократию, а винду поставляют в кучу разных стран, включая Китай. Да и при чём тут американцы, когда напрягаться должны были бы разработчики в микрософте

Цитата Сообщение от zer0mail Посмотреть сообщение
Кроме всего прочего, понадобилось бы удвоить количество дисковой памяти при переходе utf16 - utf32 (а ради чего, спрашивается).
Кодировка при записи в файл - это перпендикулярная (независимая) вещь к размеру типа wchar_t. Никто не мешает иметь 32-битный wchar_t, но файлы хранить в кодировке utf-16le

При изменении wchar_t в системе программирования и какой-нибудь должным образом сделанной дефолтной настройке в библиотеке, весь основной гемор свёлся бы только к тому, что нужно перекомпилировать программу в новой системе программирования. Ну и вылизывание всяких мелких косяков, где явно заложились на то, что размер wchar'а равен 16 битам. При этом динамические библиотеки вполне можно было бы реализовать так, что старые бинарники и пересобирать бы не пришлось, а весь гемор лёг бы на библиотеку, которая одновременно умела бы работать и по старому, и по новому. В линуксе для этого в динамических библиотеках используется версионирование, наверное и в винде что-то подобное есть
0
2688 / 2260 / 244
Регистрация: 03.07.2012
Сообщений: 8,231
Записей в блоге: 1
26.09.2014, 23:13
Разве программы в USA разрабатывает только Microsoft? Смена ядра коснулась бы всех (и независимых разработчиков и пользователей).

Впрочем, я изложил свое мнение, а дальше Ваше дело - соглашаться с ним или иметь свое, отличное (от моего )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.09.2014, 23:13

Ввести и записать в файл информацию о книгах
Ввести и записать в файл информацию о книгах по языку С++:порядковый номер,фамилия автора,название книги,город,издательство,год...

Записать всю информацию из файла в другой файл
в файл нужно записывать информацию , которая хранится после чисел -1 -1 55, ниже указан пример информации в файле -1 -1 55 ...

Ввести и записать в файл информацию о репертуаре Большого театра
напишите пожалуйста код на си++ заранее спасибо!

Структуры. Ввести и записать в файл информацию о расписании занятий 11 класса
ввести и записать в файл информацию о расписании занятий 11 класса (любые предметы). кто может дать алгоритм для написания этой программы?

Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию
Создать текстовый файл F1 не менее, чем из 10 строк и записать в него информацию 1) Скопировать в файл F2 только четные строки из F1. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru