c# - "Unable to translate Unicode character"保存到txt文件时出错

标签 c# encoding

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/

相关文章:

c# - 异步死锁?

C# 迁移到 Java,只需要知道一些事情

c# - 在 2008R2 上正确使用 Message Queue

java - 如何在java邮件的电子邮件主题行中包含英镑符号

java - 编码对 JSON 重要吗?

.net - 字符编码问题 - PHP 输出,由 .NET 通过 HttpWebRequest 读取

c# - 在 Unity 上的另一个场景中显示分数

c# - 比 DialogResult 包含更多信息的自定义 ShowDialog

MySQL 数据库文本编码错误

java - Java XML 中的字符错误?