请问有人能告诉我在处理C#中的Unicode字符串时应该注意哪些重要方面吗?
C#(以及 .Net)可以透明地处理 Unicode 字符串,除非您的应用程序需要读/写特定编码的文件,否则不需要进行任何特殊处理。在这种情况下,您可以使用 System.Text.Encodings 命名空间中的类将托管字符串转换为所选编码的字节数组。
System.String已经内部处理了Unicode,因此您已经涵盖了这一点。最佳做法是在读写文件时使用System.Text.Encoding.UTF8Encoding。然而,不仅仅是读写文件,任何流出数据的内容(包括网络连接)都将依赖于编码。如果您正在使用WCF,则大多数绑定都会默认为UTF8(实际上,大多数绑定根本不允许ASCII)。
UTF8是一个很好的选择,因为虽然它仍支持整个Unicode字符集,但对于大多数ASCII字符集,它具有字节相似性。因此,那些不支持Unicode的天真应用程序有一些机会读取/写入您的应用程序数据。只有当您开始使用扩展字符时,这些应用程序才会开始失败。
System.Text.Encoding.Unicode将写入UTF-16,每个字符至少需要两个字节,使其比ASCII更大且完全不兼容。而System.Text.Encoding.UTF32则更大。我不确定UTF-16和32的实际用例,但也许当您有大量扩展字符时它们执行得更好。这只是一个理论,但如果确实如此,那么制作主要用于这些语言的产品的日本/中国开发人员可能会发现UTF-16/32更好的选择。
在读写流时只需要考虑编码问题。使用TextReader和TextWriters来以不同的编码方式读写文本内容。如果有选择的话,始终使用utf-8。
不要被语言和文化所迷惑 - 这与unicode是完全独立的问题。
.Net具有相对良好的i18n支持。您不需要太多考虑Unicode,因为所有.Net字符串和内置字符串函数都可以正确处理Unicode。唯一需要记住的是,大多数字符串函数(例如DateTime.ToString())默认使用线程的区域设置,该区域设置默认为Windows区域设置。您可以在当前线程或每个方法调用上指定不同的区域设置进行格式化。
唯一需要注意Unicode的时候是将字符串编码/解码为字节时。