Страница 1 из 1

Как в файл записать строку в кодировке UTF-8?

Добавлено: 18 окт 2015, 09:32
Сионист
Файл бинарный, ни с какими потоками не связан, а открыт функцией CreateFile, но некоторые поля в нём должны быть текстовыми в кодировке UTF-8. Как лучше объявить константу для записи такого поля?

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 19 окт 2015, 11:20
Romeo
Что ты подразумеваешь под "полями файла"?

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 19 окт 2015, 17:09
WinMain
Используй сериализацию. Это позволяет сохранять в один бинарный файл разнородные данные. Здесь основной принцип таков: сначала в файл записывается размер данных, а потом сами данные, за ними могут идти следующие блоки данных и т.д. В начале файла обычно размещается заголовочная структура с информацией о хранимых данных, в которой записаны размеры бинарных блоков, их смещения внутри файла и прочее.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 20 окт 2015, 10:12
Decoder
Про сериализацию верно сказано. Только от себя хочу добавить, что для этого не нужно самому изобретать велосипеды. Есть готовые библиотеки на С++, в которых механизм сериализации уже реализован.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 21 окт 2015, 11:31
Сионист
Romeo писал(а):Что ты подразумеваешь под "полями файла"?
А что такое тег Вы в данном контексте понимаете? Поле - почти то же самое, но имеет фиксированную разрядность.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 21 окт 2015, 11:41
Сионист
WinMain писал(а):Используй сериализацию. Это позволяет сохранять в один бинарный файл разнородные данные.
Вопрос не в том, как превратить осмысленные данные в сырые байты, а в том, как лучше объявить константу, если с неё требуется писать UTF-8. Не строку символов типа wchar_t в его внутреннем представлении, а именно UTF-8. Но чтоб её не требовалось скармливать функции WideCharToMultiByte, а можно было сразу привести её адрес к указателю на void и результат напрямую без каких либо преобразований скормить функции WriteFile.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 21 окт 2015, 11:51
Сионист
WinMain писал(а):Здесь основной принцип таков: сначала в файл записывается размер данных, а потом сами данные, за ними могут идти следующие блоки данных и т.д.
Нет. В начале идёт заголовок, содержащий маркеры формата и версии. Тот же заголовок содержит смещение подзаголовка, размер которого зависит от версии формата, а там уже располагаются смещения данных и поля, по которым можно вычислить их количества. Иначе рискуешь прочитать полный бред, когда тебе подсунут файл чужой прилады, но по непонятной причине с тем же расширением. А так в разных форматах маркеры не совпадают, читаешь сначала маркер, сравниваешь его с эталоном и если файл чужого формата, то высвечиваешь окошко с мессагой, что формат файла приладе не известен. Но прилада работает не с абстрактным "документом", а с объектом, ни маркера файлового формата, ни файловых смещений как раз не содержащим за ненадобностью.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 21 окт 2015, 11:52
Romeo
В С++03 никак нельзя такое провернуть, так как язык поддерживает только узкие и широкие строковые литералы.

Начиная с 11 стандарта, можно дополнительно объявлять строковые литералы некоторых кодировок прямо в коде. Для UTF-8 это выглядит так:

Код: Выделить всё

u8"I'm a UTF-8 string."
Подробнее здесь в разделе Новые строковые литералы.

Re: Как в файл записать строку в кодировке UTF-8?

Добавлено: 21 окт 2015, 11:59
Сионист
Decoder писал(а):Про сериализацию верно сказано. Только от себя хочу добавить, что для этого не нужно самому изобретать велосипеды. Есть готовые библиотеки на С++, в которых механизм сериализации уже реализован.
Почитайте ка энциклопедию графических форматов, а потом прикиньте сложность задачи подружить какую то там универсальную библиотеку с любым файловым форматом и с внутренним представлением рисунка. Если сложность пользования инструмента не уступает "велосипеду", то нафиг он нужен? А если она специализирована, то ориентирована на конкретные форматы и для создания любого нового формата не применима. То есть имеем:
1. Зачем изобретать армату, когда есть кисть и краски?
2. Зачем изобретать армату, когда уже есть готовые Т 34-85, ИС 2, КВ 1 и А 32?