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

和许多人一样,我仔细地阅读了它,意识到是时候认真对待这个“ASCII 的替代品”了。不幸的是,五年后,我觉得我又陷入了这方面的一些坏习惯。你?

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

因此,为了我(以及我相信许多其他人)的利益,我可以从人们那里得到一些关于以下方面的意见:

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

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

更新:看 这个相关问题 之前也在 StackOverflow 上问过。

有帮助吗?

解决方案

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

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

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

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

其他提示

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

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

.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() :(

经验法则:如果您从不仔细观察或查看字符串内部,而是将其严格视为一团数据,那么您的情况会好得多。

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

如果您想“以 Unicode 方式”进行操作,您将需要一个非常好的库。这个东西非常复杂。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top