Ошибка «Невозможно перевести символ Юникода» при сохранении в текстовый файл - PullRequest
3 голосов
/ 07 мая 2011

Дополнительная информация: Невозможно перевести символ Unicode \ uDFFF с индексом 195 в указанную кодовую страницу.

Я создал алгоритм, результатом которого являются двоичные значения (различной длины).Я преобразовал его в uint, а затем в символы и сохранил в string Builder, как вы можете видеть ниже:

uint n = Convert.ToUInt16(tmp_chars, 2);
_koded_text.Append(Convert.ToChar(n));

Моя проблема в том, что когда я пытаюсь сохранить эти значения в .txt, я получаюранее упоминавшаяся ошибка.

StreamWriter file = new StreamWriter(filename);
            file.WriteLine(_koded_text);
            file.Close();

Что я сохраняю, это: "췾 췾 ᷿] 볯 褟 ﶞ 痢 ﳻ�� ﳻ�� 伞 伞 ﹽ ﹽ 翼 翼 ﰻ... 麞  펿  "... какие-то странные признаки.

Что мне нужно, это преобразовать эти двоичные значения в некую строку символов и сохранить ее в txt.Я где-то видел, что конвертация в UTF8 должна помочь, но я не знаю как.Поможет ли изменение кодировки файлов?

Ответы [ 2 ]

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

Вы не можете преобразовать двоичные данные в строку напрямую.Символы Unicode в строке кодируются с использованием utf16 в .NET.Эта кодировка использует два байта на символ, обеспечивая 65536 различных значений.Юникод, однако, имеет более миллиона кодовых точек.Чтобы это работало, кодовые точки Unicode над \ uffff (над BMP, Basic Multilingual Plane) кодируются суррогатной парой.Первый из них имеет значение между 0xd800 и 0xdffff, второй между 0xdc00 и 0xdfff.Это дает 2 ^ (10 + 10) = 1 миллион дополнительных кодов.

Возможно, вы увидите, к чему это приведет, в вашем случае код обнаруживает высокое суррогатное значение (0xdfff), которое не сопряжено с низкимсуррогат.Это незаконно.Множество возможных неудач, несколько кодовых точек не назначены, некоторые - диакритические знаки, которые искажаются, когда строка нормализуется.

Вы просто не можете заставить эту работу работать.Кодировка Base64 - это стандартный способ переноса двоичных данных в текстовый поток.Он использует 6 бит на символ, 3 байта требуют 4 символа.Набор символов ASCII, поэтому шансы принимающей программы, неправильно декодирующей символ обратно в двоичный, минимальны.Только десятилетний мэйнфрейм IBM, использующий EBCDIC, может доставить вам неприятности.Или просто избегайте кодирования текста и сохраняйте его двоичным.

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

Поскольку вы пытаетесь кодировать двоичные данные в текстовый поток , этот вопрос SO уже содержит ответ на вопрос: "Как мне кодировать что-то как base64?" Оттуда простой текст ASCII / ANSI подходит для выходной кодировки.

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