在C#中处理Unicode字符串的最佳实践是什么?

8

请问有人能告诉我在处理C#中的Unicode字符串时应该注意哪些重要方面吗?

7个回答

13
请注意,C#字符串是Char的序列,是UTF-16代码单元。它们不是Unicode代码点。一些Unicode代码点需要两个Char,您不应该在这些Char之间拆分字符串。
此外,Unicode代码点可以组合成一个单一的语言“字符”——例如,跟随着umlat Char的“u”Char。 因此,您也不能在任意代码点之间拆分字符串。
基本上,这是一堆问题的混合体,而任何给定的问题在实践中可能只会影响您不了解的语言。

即使现在,将近10年后,这个评论仍然非常相关。我希望有人能够添加一些内容到字符串类来处理这个问题! - David Woakes

7

C#(以及 .Net)可以透明地处理 Unicode 字符串,除非您的应用程序需要读/写特定编码的文件,否则不需要进行任何特殊处理。在这种情况下,您可以使用 System.Text.Encodings 命名空间中的类将托管字符串转换为所选编码的字节数组。


2

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更好的选择。


1

在读写流时只需要考虑编码问题。使用TextReader和TextWriters来以不同的编码方式读写文本内容。如果有选择的话,始终使用utf-8。

不要被语言和文化所迷惑 - 这与unicode是完全独立的问题。


0

.Net具有相对良好的i18n支持。您不需要太多考虑Unicode,因为所有.Net字符串和内置字符串函数都可以正确处理Unicode。唯一需要记住的是,大多数字符串函数(例如DateTime.ToString())默认使用线程的区域设置,该区域设置默认为Windows区域设置。您可以在当前线程或每个方法调用上指定不同的区域设置进行格式化。

唯一需要注意Unicode的时候是将字符串编码/解码为字节时。


0
如上所述,.NET字符串可以透明地处理Unicode。除了文件I/O之外,另一个需要考虑的是数据库层面。例如,SQL Server区分VARCHAR(非Unicode)和NVARCHAR(处理Unicode)。还需要注意存储过程参数。

-1

该链接无法访问,因此最好将参考内容添加到您的答案中。 - David Chelliah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接