【发布时间】:2008-09-27 20:28:18
【问题描述】:
有人可以告诉我在 C# 中处理 Unicode 字符串时应该注意的一些重要方面吗?
【问题讨论】:
有人可以告诉我在 C# 中处理 Unicode 字符串时应该注意的一些重要方面吗?
【问题讨论】:
请记住,C# 字符串是 Char、UTF-16 代码单元的序列。它们不是 Unicode 代码点。一些 unicode 代码点需要两个字符,您不应该在这些字符之间拆分字符串。
此外,unicode 代码点可以组合成一个单一的语言“字符”——例如,“u”字符后跟 umlat 字符。所以你也不能在任意代码点之间分割字符串。
基本上,这是一堆乱七八糟的问题,任何给定的问题实际上可能只会影响您不知道的语言。
【讨论】:
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 是在将字符串编码/解码到字节和从字节中解码时。
【讨论】:
如前所述,.NET 字符串透明地处理 Unicode。除了文件 I/O,另一个考虑因素是数据库层。例如,SQL Server 区分 VARCHAR(非 unicode)和 NVARCHAR(处理 unicode)。还需要注意存储过程的参数。
【讨论】:
【讨论】: