保存到txt文件时“无法转换Unicode字符”错误

时间:2011-05-07 13:25:09

标签: c# encoding

  

其他信息:无法使用   转换Unicode字符\ uDFFF at   索引195到指定的代码页。

我做了一个算法,结果是二进制值(不同长度)。我将其转换为uint,然后转换为字符并保存到字符串构建器中,如下所示:

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 个答案:

答案 0 :(得分:3)

您无法直接将二进制数据转换为字符串。字符串中的Unicode字符使用.NET中的utf16进行编码。该编码每个字符使用两个字节,提供65536个不同的值。然而,Unicode有超过一百万个代码点。为了实现这一目的,\ uffff上方的Unicode代码点(在BMP,Basic Multilingual Plane之上)使用代理对进行编码。第一个值介于0xd800和0xdbff之间,第二个介于0xdc00和0xdfff之间。这提供了2 ^(10 + 10)= 100万个附加代码。

您可能会看到这导致的位置,在您的情况下,代码会检测到与低代理配对的高代理值(0xdfff)。那是违法的。更多可能的事故,几个代码点是未分配的,有些是变音符号,当字符串被规范化时会被破坏。

你无法做到这一点。 Base64编码是跨文本流传输二进制数据的标准方法。它每个字符使用6位,3个字节需要4个字符。字符集是ASCII,因此接收程序将字符解码为二进制错误的几率是最小的。只有几十年前使用EBCDIC的IBM大型机可能会让您遇到麻烦。或者只是简单地避免编码到文本并保持二进制。

答案 1 :(得分:0)

由于您尝试将二进制数据编码为文本流this SO question已经包含对问题的答案:“如何将某些内容编码为base64?”从那里,纯ASCII / ANSI文本适用于输出编码。