在C#中处理Unicode字符串时,有人可以提供一些我应该注意的重要方面吗?
答案 0 :(得分:12)
请记住,C#字符串是Char,UTF-16代码单元的序列。它们不是 Unicode代码点。一些unicode代码点需要两个Char,你不应该在这些Chars之间分割字符串。
此外,unicode代码点可以组合形成单个语言'character' - 例如,'u'Char后跟umlat Char。因此,您无法在任意代码点之间拆分字符串。
基本上,这是一堆混乱的问题,任何特定的问题可能只会在实践中影响你不认识的语言。
答案 1 :(得分:7)
C#(和.Net一般)透明地处理unicode字符串,除非您的应用程序需要读取/写入具有特定编码的文件,否则您不必执行任何特殊操作。在这些情况下,您可以使用System.Text.Encodings命名空间中的类将托管字符串转换为您选择的编码的字节数组。
答案 2 :(得分: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是更好的选择。
答案 3 :(得分:1)
只考虑读写流时的编码。使用TextReader和TextWriters以不同的编码读写文本。如果您有选择,请始终使用utf-8。
不要被语言和文化弄糊涂 - 这与unicode完全不同。
答案 4 :(得分:0)
.Net拥有相对较好的i18n支持。您并不需要考虑unicode,因为所有.Net字符串和内置字符串函数都使用unicode做正确的事情。唯一要记住的是,大多数字符串函数(例如DateTime.ToString())默认使用线程的文化,默认情况下是Windows文化。您可以在当前线程或每个方法调用上指定不同的文化格式。
unicode问题的唯一时间是将字符串编码/解码为字节。
答案 5 :(得分:0)
如前所述,.NET字符串透明地处理Unicode。除文件I / O外,另一个考虑因素是数据库层。例如,SQL Server区分VARCHAR(非unicode)和NVARCHAR(处理unicode)。还需要注意存储过程参数。
答案 6 :(得分:0)