2010-10-17 63 views
1

在.NET中,一个字符串是一个unicode字符串。我的理解是字符串本身不包含任何特定的编码信息,即编码是否中性?只要编码方法与解码方法相匹配,您可以使用任何编码方法将字符串解码为字节流,然后将字节流编码为可识别的字符串?是(unicode)字符串编码中性吗?

回答

3

是的,许多编码方案不能容纳所有Unicode码点,这使得一些往返行程不具有幂等性。

+0

嗨我用中文编码方案“Encoding.GetEncoding(936)”和StreamWriter类写一个中文字符串到.txt文件中。为什么记事本程序可以正确显示字符,即使我没有指定记事本程序使用哪种编码?我知道有一个自动字节标记检测,但我不认为它可以自动检测一个奇特的编码方案? – Aperture 2010-10-17 09:17:55

+0

@孔径:记事本将一些启发式算法应用于文件的开头,以计算编码。如果通常得到正确的结果,但有可能愚弄它。 [详见Michael Kaplan的博客。](http://blogs.msdn.com/b/michkap/archive/2007/04/22/2239345.aspx) – Richard 2010-10-17 09:54:32

+0

@Richard:Bravo!这里充满了知识渊博的人! – Aperture 2010-10-17 11:28:31

1

.NET中的“U​​nicode”是UTF-16或UCS-2(2字节)。它本身就是完整Unicode字符集的编码,它需要32位(4字节,UCS-4)来保存所有字符。因此,您可以按原样序列化这些字节,并且它们将在任何支持UTF-16的系统上进行恢复,这些系统将正确地反序列化它们。

5

.Net字符串由UTF-16字符组成。没有“Unicode字符串”这样的东西。它可以是UCS2或UCS4字符串,或UTF-7,UTF-8,UTF-16等各种转换格式,但不能称其为“Unicode”。理解它们之间的区别很重要。

我知道.Net团队中有人调用Encoding类“Unicode”的属性,但它是一个错误。而且这个类还包含“默认”属性,这是另一个错误的属性。这导致了许多缺陷(大多数人不阅读手册,他们根本没有意识到“Unicode”是UTF-16,“Default”是默认的OS代码页)。

至于你的问题的第二部分,答案不幸的是没有。这将是“是”,但有一个小问题。它是GB18030编码 - 中国PRC的标准编码。它已经分配了Unicode标准中尚不存在的代码点(尚未)。 Unicode标准的新版本可能会解决此问题。

这里的一个重点(返回到UTF-16)是字节对转换没有必要。问题与代理对有关,您必须小心,因为一个字符可以由两个对定义,即四个字节。

如果你不在意支持GB18030编码,你可以使用你提到的方法。如果碰巧你想在中国销售你的软件,你需要支持它,当然你必须非常小心(需要进行大量的测试)。

+0

嗨,谢谢澄清我的一个长期问题(UnicodeEncoding和UTF8Encoding有什么区别)。那么Unicode = UTF-16和UTF-8 = UTF-8? – Aperture 2010-10-17 09:22:52

+0

在GB18030编码的情况下,您的意思是它定义的代码点在16位UNICODE标准中甚至在32位UNICODE/ISO 10646标准中没有任何coutnerparts? – 2010-10-17 09:23:49

+0

@Ondrey:从一个角度来说,我的意思是说GB18030比ISO 10646定义了更多的代码点,所以没有办法转换这些附加的代码点。但是我听说GB18030:2005指定了一些在Unicode 5.1中没有等值的字形。我错了吗? – 2010-10-17 09:32:45