在.NET中,一个字符串是一个unicode字符串。我的理解是字符串本身不包含任何特定的编码信息,即编码是否中性?只要编码方法与解码方法相匹配,您可以使用任何编码方法将字符串解码为字节流,然后将字节流编码为可识别的字符串?是(unicode)字符串编码中性吗?
回答
是的,许多编码方案不能容纳所有Unicode码点,这使得一些往返行程不具有幂等性。
.NET中的“Unicode”是UTF-16或UCS-2(2字节)。它本身就是完整Unicode字符集的编码,它需要32位(4字节,UCS-4)来保存所有字符。因此,您可以按原样序列化这些字节,并且它们将在任何支持UTF-16的系统上进行恢复,这些系统将正确地反序列化它们。
.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编码,你可以使用你提到的方法。如果碰巧你想在中国销售你的软件,你需要支持它,当然你必须非常小心(需要进行大量的测试)。
嗨,谢谢澄清我的一个长期问题(UnicodeEncoding和UTF8Encoding有什么区别)。那么Unicode = UTF-16和UTF-8 = UTF-8? – Aperture 2010-10-17 09:22:52
在GB18030编码的情况下,您的意思是它定义的代码点在16位UNICODE标准中甚至在32位UNICODE/ISO 10646标准中没有任何coutnerparts? – 2010-10-17 09:23:49
@Ondrey:从一个角度来说,我的意思是说GB18030比ISO 10646定义了更多的代码点,所以没有办法转换这些附加的代码点。但是我听说GB18030:2005指定了一些在Unicode 5.1中没有等值的字形。我错了吗? – 2010-10-17 09:32:45
- 1. 是Django双重编码一个Unicode(utf-8?)字符串吗?
- 2. 不能够编码的Unicode字符串
- 3. C++字符串编码UTF8/unicode的
- 4. SQL Unicode转换编码VARBINARY字符串
- 5. iOS编码字符串到unicode
- 6. 字符串与Unicode编码 - Struct()参数
- 7. Python使用unicode编码的字符串
- 8. Python的编码在Unicode字符串
- 9. M2Crypto RSA Unicode字符串编码不同于字节字符串
- 10. 将url编码的字符串转换为python unicode字符串
- 11. 如何将Unicode编码的字符串转换为字符串
- 12. 在Python unicode字符串中处理错误编码的字符
- 13. 使用转义Unicode编码解码字符串(5个字符)
- 14. Url Unicode字符编码
- 15. Unicode代码字符串
- 16. 宽字符字符串文字是用UTF-16LE编码的吗?
- 17. ResultSet getString字符编码的Unicode字符
- 18. 什么是unicode字符串?
- 19. 编码Unicode字符到HTML中的Qt
- 20. 在iOS中解码unicode字符串
- 21. python的字符串是unicode字符
- 22. PHP concatenate字符与Unicode编码的字符编码
- 23. 解码和编码Unicode字符为“\ü####”
- 24. Unicode字符打破JSON编码/解码
- 25. Perl:解码“乱码”Unicode字符串
- 26. 将Unicode键码解码为字符串
- 27. 如何Unicode编码字符变量转换为Unicode字符python2
- 28. Unicode字符串
- 29. Unicode字符串
- 30. 在python 2.7中将错误编码为unicode字符串?
嗨我用中文编码方案“Encoding.GetEncoding(936)”和StreamWriter类写一个中文字符串到.txt文件中。为什么记事本程序可以正确显示字符,即使我没有指定记事本程序使用哪种编码?我知道有一个自动字节标记检测,但我不认为它可以自动检测一个奇特的编码方案? – Aperture 2010-10-17 09:17:55
@孔径:记事本将一些启发式算法应用于文件的开头,以计算编码。如果通常得到正确的结果,但有可能愚弄它。 [详见Michael Kaplan的博客。](http://blogs.msdn.com/b/michkap/archive/2007/04/22/2239345.aspx) – Richard 2010-10-17 09:54:32
@Richard:Bravo!这里充满了知识渊博的人! – Aperture 2010-10-17 11:28:31