MemoryStream из строки - путаница в использовании кодировки - PullRequest
7 голосов
/ 31 мая 2011

У меня есть кусок кода, который преобразует строку в поток памяти:

using (MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(applicationForm)))

Однако я немного запутался, если это правильно. По сути, я всегда запутался в кодировке .NET.

Итог: использовать ли правильный кодирующий объект ( UTF8 ) для получения байтов?

Я знаю, что внутренне .NET хранит строку как UTF-16 , но моя переменная applicationForm была основана на файле с текстом, который был сохранен в UTF-8 кодировка.

Спасибо, Pawel

РЕДАКТИРОВАТЬ 1: Давайте объясним, как именно я получаю applicationForm переменную. У меня есть доступ к сборке, которая предоставляет класс с методом GenerateApplicationForm . Этот метод возвращает строку. Однако я знаю, что где-то за кулисами компонент использует файлы, хранящиеся на диске. Содержимое этих файлов кодируется с использованием UTF-8. Поэтому я не могу прочитать файл напрямую и т. Д. У меня есть только эта строка, и я знаю, что изначально используется файл в кодировке UTF-8. В клиентском коде, который использовал GenerateApplicationForm компонент, я должен преобразовать переменную applicationForm в поток, потому что другие компоненты (из другой сборки) ожидают Stream, Вот где с использованием оператора .... , упомянутого в вопросе, вступает в действие.

Ответы [ 5 ]

3 голосов
/ 31 мая 2011

Предположим, applicationForm - это строка, которую вы читаете из какого-то текстового файла UTF8.Это будет UTF16 / Unicode независимо от кодировки исходного файла.Преобразование произошло, когда вы загрузили файл в строку.

Ваш код закодирует строку applicationForm в MemoryStream из UTF8 байтов.

Это может или не может бытьисправить в зависимости от того, что вы хотите с ним сделать.

.Net строки всегда UTF16 или Unicode.Когда Strings преобразуются в файлы, потоки или byte[], они могут кодироваться различными способами.1 байт недостаточно для хранения всех различных символов, используемых во всех языках, поэтому необходимо кодировать более сложные строки, чтобы один символ мог быть представлен более чем одним байтом, иногда или всегда в зависимости от используемой кодировки.

Если вы используете простую кодировку, например ASCII, один символ всегда будет состоять из одного байта, но данные будут ограничены набором символов ASCII.Преобразование в 'ASCII' из любой кодировки UTF может привести к потере данных, если используются какие-либо многобайтовые символы.

Для получения полной картины на Unicode перейдите сюда .

РЕДАКТИРОВАТЬ 1: Запретить дополнительную информацию о компоненте GenerateApplicationForm , включая UTF8, вероятно, будет правильным выбором.Если это не помогло, попробуйте ASCII или UTF16.Лучше всего обратиться к исходному коду компонента или поставщику компонента.

РЕДАКТИРОВАТЬ 2: Определенно UTF8 тогда вы были правы все время.

0 голосов
/ 31 мая 2011

Кодировка байтов UTF8 создает представление ваших данных, которое обратно совместимо с набором символов ASCII для представления ваших данных. Поскольку ASCII является наименьшим общим знаменателем для передачи данных, вы можете в значительной степени гарантировать, что это представление будет работать в подавляющем большинстве систем.

Хотя вы можете изменить его, вы предполагаете, что любая система, которая его использует, поймет, что вы ее изменили, и будет поддерживать ваше новое представление. Это довольно сложное предположение, чтобы проверить. Кодировки на обоих концах сильно совпадают.

Если, как вы говорите, вы не можете изменить систему, которая генерирует вашу строку, тогда да, вы делаете это правильно. Это работает, так почему вы считаете, что вам нужно внести изменения? Внутренние аспекты того, как .NET представляет строку, здесь не вступают в игру, вы не получаете строку .NET, вы получаете закодированное в UTF-8 представление значения, поэтому вы должны использовать UTF8, чтобы декодировать его в исходное значение. .

0 голосов
/ 31 мая 2011

Просто используйте ту же кодировку для чтения, что и для записи.Если это был UTF8 -> используйте UTF8.Если вы пишете по-китайски, кто-то должен уметь читать по-китайски, чтобы понять вас ...

0 голосов
/ 31 мая 2011

Для UTF-8 Byte Order Mark (BOM) должна быть добавлена ​​в начале файла. Посмотрите файл utf-8, затем используйте конвертер utf-8.

0 голосов
/ 31 мая 2011

Если данные сохранены в UTF-8, вам нужно открыть их с помощью UTF-8.

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