Additional information: Unable to translate Unicode character \uDFFF at index 195 to specified code page.
我做了一个算法,结果是二进制值(不同长度)。我将其转换为 uint
,然后转换为 chars 并保存到 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 应该有所帮助,但我不知道该怎么做。更改文件编码也有帮助吗?
最佳答案
您不能将二进制数据直接转换为字符串。字符串中的 Unicode 字符在 .NET 中使用 utf16 编码。该编码每个字符使用两个字节,提供 65536 个不同的值。然而,Unicode 有超过一百万个代码点。为了实现这一点,\uffff 之上的 Unicode 代码点(BMP,基本多语言平面之上)使用代理对进行编码。第一个的值介于 0xd800 和 0xdbff 之间,第二个的值介于 0xdc00 和 0xdfff 之间。这提供了 2 ^ (10 + 10) = 100 万个额外代码。
您或许可以看到这导致的结果,在您的情况下,代码检测到未与低代理项配对的高代理项值 (0xdfff)。那是非法的。更多可能的错误,一些代码点未分配,一些变音符号在字符串规范化时被破坏。
你就是无法完成这项工作。 Base64 编码是在文本流中传输二进制数据的标准方式。每个字符使用 6 位,3 个字节需要 4 个字符。字符集是 ASCII,因此接收程序错误地将字符解码回二进制的可能性很小。只有使用 EBCDIC 的几十年前的 IBM 大型机才会给您带来麻烦。或者只是简单地避免编码为文本并保持二进制。
关于c# - "Unable to translate Unicode character"保存到txt文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5921349/