Предлагаю вам прочитать Joel Spolsky's excellent article on the subject of character sets and encodings. Короче говоря:
- Файл представляет собой всего лишь последовательность байтов.
- Строка представляет собой последовательность символов.
- набор символов определяет набор символов и assignes уникальный код точку (целое число, представляющее символ - обратите внимание, что «целое число» не обязательно является
int
) к каждому символу.
- Если вы хотите сохранить строку в файле, вам необходимо преобразовать последовательность символов в последовательность байтов. Для наборов символов с 256 символами или менее обычно существует взаимно однозначное соответствие между символами и байтами, но для больших наборов символов, таких как Unicode, оно становится более сложным.
- Кодировка определяет, как коды символов для символов строки должны быть переведены в байты.
Таким образом, при изменении кодировки одна и та же строка преобразуется в другую последовательность байтов.
Обратите внимание, что поведение наборов символов и кодировок не зависит от языка программирования. Что такое изменения, как вы относитесь к различным кодировкам и наборам символов и используете их (как правило, кодировка привязана к определенному набору символов, поэтому выбор кодировки также неявно выбирает набор символов). В случае с C# Encoding.Unicode
плохо назван - это набор символов Unicode , но кодировка UTF-16LE (в которой каждый второй байт будет 00
, если вы используете только английские символы).
Кроме того, обратите внимание, что строки представлены как char
массивов внутренне в программе, где каждый char
представляет собой значение, которое представляет собой две последующих байты из UTF-16 кодировки (так что некоторые фантазии персонажей действительно могут быть представлены в виде два char
значений) , Вы не можете получить доступ к этому массиву напрямую, и большая часть функциональности строки пытается абстрагировать этот факт. Это внутреннее кодирование не влияет на то, как строки записываются в файлы (либо вы выбираете кодировку вручную, либо получаете набор символов по умолчанию, который вы вызываете), что для StreamWriter
является UTF-8 (благодаря @xanatos для коррекция)).
Если вас интересует, почему 'int' и' string' закодированы в один и тот же гекс, 'StreamWriter' записывает как строку. Попробуйте 'BinaryWriter' увидеть разницу – Orifjon