12

大约 5 年前,Joel Spolsky 写了这篇文章,“每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最低要求(没有借口!)”

像许多人一样,我仔细阅读了它,意识到是时候掌握这个“ASCII 替代品”了。不幸的是,5 年后,我觉得我在这方面又陷入了一些坏习惯。你?

我没有编写很多专门的国际应用程序,但是我帮助建立了许多面向 ASP.NET 互联网的网站,所以我想这不是借口。

因此,为了我的利益(我相信还有很多其他人),我可以从以下人员那里获得一些意见:

  • 如何一劳永逸地“克服”ASCII
  • 使用 Unicode 时的基本指导。
  • 推荐的(最近的)关于 Unicode 的书籍和网站(面向开发人员)。
  • Unicode 的现状(Joels 发表文章 5 年后)
  • 未来发展方向。

我必须承认我有 .NET 背景,因此我也很乐意了解 .NET 框架中的 Unicode 信息。当然,这不应该阻止任何具有不同背景的人发表评论。

更新:请参阅之前在 StackOverflow 上提出的这个相关问题。

4

4 回答 4

9

自从我阅读了 Joel 文章和其他一些 I18n 文章以来,我一直密切关注我的字符编码;如果您始终如一地这样做,它实际上会起作用。如果您在一家标准使用 UTF-8 的公司工作,并且每个人都知道/做到这一点,那么它将起作用。

这里有一些关于这个主题的有趣文章(除了 Joel 的文章):

第一篇文章的引述;使用 Unicode 的提示:

  • 拥抱 Unicode,不要与之抗争;这可能是正确的做法,如果不是,您可能无论如何都必须这样做。
  • 在您的软件中,将文本存储为 UTF-8 或 UTF-16;也就是说,两者选其一并坚持下去。
  • 尽可能使用 XML 与外界交换数据;这使得一大堆潜在的问题消失了。
  • 尝试使您的应用程序基于浏览器而不是编写您自己的客户端;浏览器在处理世界文本方面变得非常好。
  • 如果你正在使用其他人的库代码(当然你是),假设它的 Unicode 处理被破坏,直到被证明是正确的。
  • 如果您正在搜索,请尝试将语言和字符处理问题交给了解它们的人。
  • 去亚马逊或其他地方购买印刷的 Unicode 标准的最新版本;它包含了您需要知道的所有内容。
  • 花一些时间浏览 Unicode 网站并了解代码图表的工作原理。
  • 如果您需要认真研究亚洲语言,请购买 Ken Lunde 所著的 O'Reilly 书籍。
  • 如果您有 Macintosh,请使用 Lord Pixel 的 Unicode 字体检查工具。非常酷。
  • 如果您真的要对数据感到厌烦,请参加一年两次的 Unicode 会议。所有的专家都会去,如果你不知道你需要知道什么,你可以在那里找到知道的人。
于 2008-09-12T14:38:56.557 回答
4

我花了一段时间使用搜索引擎软件——你不会相信有多少网站提供带有 HTTP 标头或元标记的内容,这些内容与页面的编码有关。通常,您甚至会得到一个包含 ISO-8859 字符和 UTF-8 字符的文档。

一旦您解决了其中一些问题,您就开始认真对待您生成的数据的正确字符编码。

于 2008-09-12T14:26:19.567 回答
3

.NET Framework 使用 Windows 默认编码来存储字符串,结果是 UTF-16。如果您在使用大多数文本 I/O 类时没有指定编码,您将编写没有 BOM 的 UTF-8,并通过首先检查 BOM 然后假设 UTF-8 来读取(我肯定知道StreamReaderStreamWriter以这种方式行事。 ) 这对于无法理解 BOM 的“愚蠢”文本编辑器来说是相当安全的,但对于可以显示 UTF-8 的更智能的文本编辑器或您实际编写标准 ASCII 范围之外的字符的情况来说,这有点粗糙。

通常这是看不见的,但它可以以有趣的方式抬头。昨天我和一个使用 XML 序列化将对象序列化为字符串的人一起工作StringWriter,他不明白为什么编码总是 UTF-16。由于内存中的字符串将是 UTF-16 并且由 .NET 强制执行,因此这是 XML 序列化框架唯一可以做的事情。

因此,当我编写的不仅仅是一次性工具时,我会使用 BOM 指定 UTF-8 编码。从技术上讲,在 .NET 中,您总是会意外地意识到 Unicode,但前提是您的用户知道将您的编码检测为 UTF-8。

每次看到有人问“我如何获取字符串的字节数”时,我都会哭笑不得。建议的解决方案使用Encoding.ASCII.GetBytes():(

于 2008-09-12T15:08:56.237 回答
2

经验法则:如果您从不研究或查看字符串内部,而是严格将其视为数据块,您的情况会好得多。

如果您想以“Unicode 方式”来做,即使是像拆分单词或小写字符串这样简单的事情也会变得困难。

如果你想以“Unicode 方式”来做,你需要一个非常好的库。这东西非常复杂。

于 2008-09-12T14:54:41.620 回答