在C#中处理Unicode字符串的最佳实践是什么?
有人可以提供给我一些在C#中处理Unicode字符串时应注意的重要方面吗?
解决方案
C(通常和.Net)透明地处理unicode字符串,除非应用程序需要使用特定编码读取/写入文件,否则我们无需执行任何特殊操作。在这些情况下,可以通过使用System.Text.Encodings命名空间中的类将托管字符串转换为所选编码的字节数组。
读写流时只考虑编码。使用TextReader和TextWriters以不同的编码读取和写入文本。如果可以选择,请始终使用utf-8.
不要被与unicode完全不同的语言和文化所困扰。
.Net具有相对较好的i18n支持。我们实际上不需要考虑Unicode,因为所有.Net字符串和内置字符串函数都可以对Unicode进行正确的处理。唯一要记住的是,大多数字符串函数(例如DateTime.ToString())默认情况下都使用线程的区域性,默认情况下,其是Windows文化。我们可以在当前线程或者每个方法调用上指定不同的区域设置格式。
唯一的一次Unicode问题是在字符串与字节之间进行编码/解码时。
请记住,Cstring是Char,UTF-16代码单元的序列。它们不是Unicode代码点。某些Unicode代码点需要两个字符,因此我们不应在这些字符之间分割字符串。
另外,unicode代码点可以组合形成一个单一的语言"字符",例如,一个" u"字符,后跟umlat字符。因此,我们也不能在任意代码点之间分割字符串。
基本上,这是一堆乱七八糟的问题,其中任何给定的问题只能在实践中影响我们不知道的语言。
如前所述,.NET字符串透明地处理Unicode。除了文件I / O之外,其他考虑还应该在数据库层。例如,SQL Server区分VARCHAR(非Unicode)和NVARCHAR(处理Unicode)。还需要注意存储过程的参数。
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是一个更好的选择。
可以在此线程上找到更多详细信息:
http://discuss.joelonsoftware.com/default.asp?dotnet.12.189999.12