Можно ли поместить два вида наборов символов в одном файле - PullRequest
0 голосов
/ 26 февраля 2011

Я только что задал этот вопрос из любопытства.Как правило, файлы хранятся с одним набором символов.Но где будет сохранен тип набора символов?И возможно ли поместить два вида строк (например, std :: string, std :: wstring) в один и тот же файл?

Ответы [ 4 ]

4 голосов
/ 26 февраля 2011

Были введены наборы символов, чтобы позволить различным программам интерпретировать один и тот же набор символов (а именно, однобайтовые символы, десятичное значение которых превышает 127, или, другими словами, чей старший бит установлен) в разныхпути.Если вы хотите переключать наборы символов частично через файл или поток, вам придется каким-то образом сигнализировать вашей программе, либо в файле, либо вне полосы.

Что касается смешивания std::string и std::wstring, хотя это возможно, это в лучшем случае сбивает с толку.string с (как правило) ASCII и wstring с Unicode.При создании файла вы можете поместить сигнал или маркер, который скажет вашей программе переключиться при чтении его обратно.

Как правило, если вам нужно более одного набора символов, вы должны использовать Unicode (которыйможет быть представлен с std::wstring).На самом деле, если вы вообще обрабатываете пользовательский ввод, вам следует использовать Unicode.

Читайте статью Джоэла Спольски «Абсолютный минимум», который должен знать каждый разработчик программного обеспечения.Оправдания!) .Это должно помочь прояснить ситуацию.

1 голос
/ 26 февраля 2011

Файл - это просто последовательность байтов.Байт - это просто 8-значное (на любом современном оборудовании) двоичное число в диапазоне от 0 до 255, если интерпретируется как без знака, или от -128 до 127, если интерпретируется как со знаком.

Что означают эти байтыдля тех, кто разработан этот конкретный формат файла.Он может содержать последовательность символов, закодированных с помощью какой-то одной кодировки, указанной каким-либо образом или указанной в документации формата файла, он может содержать нечестивый беспорядок в различных кодировках без каких-либо различий между ними (я видел такие вещи на самом деле,критически важные приложения), он может содержать смесь двоичных и текстовых данных или двоичные данные, которые не имеют никакого отношения к каким-либо символам или наборам символов.

Однако, если формат файла не является двоичнымто есть, если он содержит текст и только текст, смешивать наборы символов обычно крайне плохо.Использование чего-то унифицированного и ASCII-совместимого, такого как UTF-8, вероятно, лучший способ.Даже в двоичном формате все равно рекомендуется закодировать все текстовые данные в одной кодировке.UTF-8 или UTF-16 (или даже UTF-32) кажутся там хорошим выбором.Иногда есть разные требования, с которыми вам приходится иметь дело.Например, двоичный формат может иметь «старую» версию заголовка и «новую».Старый может использовать какой-то устаревший набор символов, а новый может использовать какой-то Unicode.Все в порядке.Но когда дело доходит до чисто текстовых форматов, мне еще предстоит увидеть широко используемый формат, который позволяет смешивать наборы символов.Некоторые позволяют вам выбрать один набор символов для каждого файла и поместить маркер где-нибудь (например, XML, HTML, источники Python).

1 голос
/ 26 февраля 2011

Если ваш вопрос касается кодировки самого исходного файла, ответ заключается в том, что стандарт C ++ требует реализации для поддержки исходных файлов, закодированных в базовом наборе символов.Реализации Complier могут поддерживать дополнительные наборы символов.Обратитесь к руководствам по компилятору для получения дополнительной информации.

Об использовании std::string и std::wstring переменных в одном файле, да, вы можете использовать вместе.

1 голос
/ 26 февраля 2011

Кодировки символов абсолютно бесплатны.Файлы являются контейнерами байтов.Вы можете закодировать текст в смесь символов в кодировке ASCII, UTF8, Big5, ..., но вам решать, как интерпретировать каждый из них.

Соглашение , хотя, должен поставить маркер в первой позиции файла, который обозначает кодировку.(cfr Порядок следования байтов в Википедии).

При использовании xml это стало гораздо более явным (пока не полностью включено): кодировка должна быть включенапервая строка, и эта строка должна быть в UTF8.(Если кодировка опущена, это означает: «utf-8»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...