2011-05-07 3 views
3

Дополнительная информация: Не удается перевести Unicode символ \ uDFFF на индекс 195 до указанной кодовой страницы.«Невозможно перевести Unicode символ» ошибка при сохранении в текстовый файл

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

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 должно помочь, но я не знаю, как это сделать. Помогло бы также изменить кодировку файлов?

+1

Вы действительно пытаетесь написать кучу ints в txt-файле? Вы хотите, чтобы эти ints были доступны для чтения в txt-файле? Если это действительно байтовый массив, то будет нужна поддержка кодировки base64? – Dialecticus

ответ

3

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

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

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

+0

9873 chars ling "двоичная строка" становится 13165 символов длинной base64 строки. Любой другой способ, как это сделать? Проблема в том, что я не могу сохранить его в двоичном файле, потому что этот файл содержит больше, чем только это. –

+0

На вашем жестком диске наверняка имеется еще несколько миллиардов неиспользуемых байтов? Терабайт стоит менее ста долларов, вы не можете беспокоиться о нескольких килобайтах. Конечно, не стоит другой схемы кодирования, которая уменьшает ее на 10%. –

+0

Ну нет, это не проблема. Это просто алгоритм, который я должен сделать. –

0

Поскольку вы пытаетесь кодировать двоичные данные в текстовый поток this SO question уже содержит ответ на вопрос: «Как кодировать что-то как base64?» Оттуда обычный текст ASCII/ANSI подходит для кодировки вывода.

Смежные вопросы