为什么不是我们在Unicode中所做的一切?

鉴于Unicode已经有18年了 ,为什么仍然有应用程序没有Unicode的支持? 即使我的一些操作系统和Unicode的经验,至less可以说是痛苦的。 正如Joel Spolsky在2003年指出的那样, 并不难。 那么交易是什么? 为什么我们不能把它们放在一起?

从几个问题开始

多久…

  • 你需要编写一个应用程序,处理与ascii不同的东西吗?
  • 你需要编写一个多语言的应用程序?
  • 你写的应用程序必须从第一版多语言?
  • 你听说过Unicode是用来表示非ASCII字符吗?
  • 你有没有读过Unicode是一个字符集? 那个Unicode是一种编码?
  • 你看到人们把UTF-8编码的字节串和Unicode数据混淆了吗?

你知道sorting和编码之间的区别吗?

你从哪里听说过Unicode?

  • 在学校? ( 真的吗?
  • 工作中?
  • 在一个时髦的博客?

你有没有,在你年轻的时候,有经验的移动源文件从地区A的系统到地区B的系统,在系统B上编辑了一个错字,保存了所有的非ASCII文件,浪费大量时间试图了解发生了什么? (你的编辑器把你的编译器混淆了吗?编译器?系统?…?)

你最终决定再也不会使用非ascii字符来评论你的代码吗?

看看其他地方正在做些什么

python

我有没有提到我爱Python? 没有? 那么我喜欢Python。

但是在Python3.0之前,它的Unicode支持被吸引了。 还有那些新手程序员,他们当时几乎不知道如何编写循环,在尝试处理非ASCII字符时从无处获取UnicodeDecodeErrorUnicodeEncodeError 。 那么他们基本上已经被Unicode怪物所伤害,我知道很多非常有效的/有经验的Python编码人员,他们今天仍然害怕不得不处理Unicode数据的想法。

而对于Python3来说,Unicode和bytestrings之间有明确的分离,但是……看看把应用程序从Python 2.x移植到Python 3.x是多么麻烦,如果你以前不太关心分离/如果你真的不明白Unicode是什么。

数据库,PHP

你知道一个stream行的商业网站,其国际文本存储为Unicode吗?

你会(可能)惊讶地发现维基百科的后端不使用Unicode来存储它的数据。 所有文本都以UTF-8编码,并以二进制数据的forms存储在数据库中。

这里的一个关键问题是如何将文本数据存储为Unicode代码点。 Unicode sorting规则定义了Unicode代码点的sorting顺序。 但是,对数据库中的sorting规则的适当支持正在失去/正在积极的开发中。 (也许还有很多性能问题 – IANADBA)另外,还没有被广泛接受的sorting规范:对于某些语言,人们不同意如何对单词/字母/单词组进行sorting。

你听说过Unicode规范化吗? (基本上,在存储数据之前,你应该把你的Unicode数据转换成规范表示)当然这对于数据库存储或本地比较来说是至关重要的。 但是PHP例如只支持从2007年8月发布的5.2.4开始的标准化。

事实上,PHP并不完全支持Unicode。 我们将不得不等待PHP6来获得与Unicode兼容的function。

那么,为什么不是我们在Unicode中所做的一切?

  1. 有些人不需要Unicode。
  2. 有些人不在乎。
  3. 有些人不明白以后需要Unicode支持。
  4. 有些人不懂Unicode。
  5. 对于其他人来说,Unicode有点像Web应用程序的可访问性:你开始没有,并且稍后会增加对它的支持
  6. 许多stream行的库/语言/应用程序缺乏适当的,完整的Unicode支持,更不用说归类和规范化问题。 直到开发堆栈中的所有项目都完全支持Unicode,您将无法编写干净的Unicode应用程序。

互联网显然有助于传播Unicode趋势。 这是一件好事。 像Python3这样的主动改变帮助教育人们关于这个问题。 但是,我们将不得不耐心地等待所有Unicode和新程序员本能地使用Unicode代替string。

对于这个轶事,由于联邦快递没有明显支持国际地址, 谷歌暑期学校的09名学生都被Google要求提供一个ascii专用的运输名称和地址。 如果你认为大多数商业angular色理解Unicode支持背后的风险,那你就错了。 联邦快递不明白,他们的客户并不在乎。 然而。

  • 许多产品开发人员不认为他们的应用程序正在亚洲或其他需要Unicode的地区使用。
  • 将现有的应用程序转换为Unicode是昂贵的,通常由销售机会驱动。
  • 许多公司都将产品保留在传统系统上,迁移到Unicode意味着一个全新的开发平台。
  • 您会惊讶到有多less开发人员不了解Unicode在多语言环境中的全部含义。 这不仅仅是使用宽string的情况。

底线 – 成本。

可能是因为人们习惯于使用ASCII码,而大量的编程是由母语为英语的人完成的。

国际海事组织,这是一个集体习惯的function,而不是有意识的select。

与Unicode一起工作的开发工具的广泛可用性可能是比你想象的更近的事件。 直到几年前,使用Unicode才是在字符格式之间转换并处理不完整或错误的实现的痛苦任务。 你说这不是那么难,随着工具的改进越来越真实,但除非你的语言和图书馆能够为你隐藏细节,否则有很多方法可以去做。 地狱,只是剪切和粘贴unicode字符可能是几年前一个可疑的命题。 开发者教育也花了一些时间,你还是看到人们犯了很多真正的基本错误。

Unicode标准重约10磅。 即使只是对它的概述,也要讨论字符,字形,代码点等之间的细微区别。现在考虑一下ASCII。 这是128个字符。 我可以把整个事情解释给大约5分钟知道二进制文件的人。

我相信现在几乎所有的软件都应该是完全支持Unicode编码的,但是为了达到一个真正的国际性的字符编码来适应不同的目的还有很长的路要走,而且还没有结束。

懒惰,无知

一个巨大的因素是编程语言的支持,其中大部分使用一个字符集,适合8位(如ASCII)作为string的默认值。 Java的String类使用UTF-16,还有一些支持Unicode的变体,但许多语言select简单。 空间是如此微不足道的一个问题,那些坚持“节约空间”string的编码者应该被打了一巴掌。 大多数人只是不在embedded式设备上运行,甚至像手机这样的设备(不久的将来的大规模计算浪潮)也可以轻松处理16位字符集。

另一个因素是许多程序只写英文,而开发者(1)没有计划(甚至不知道如何)将他们的代码本地化为多种语言,(2)他们甚至没有考虑处理非罗马语言的input。 英语是程序员使用的主要自然语言(至less是相互沟通),而且在很大程度上是由我们生产的软件所传递的。 然而,冷漠和/或无知当然不能永远持续下去……鉴于亚洲移动市场完全超越世界其他地区,程序员将不得不很快处理Unicode,无论他们喜欢与否。

对于它的价值,我不认为Unicode标准的复杂性对于程序员来说并不是那么重要,而是对那些必须实现语言支持的人来说。 在用已经完成的努力的语言进行编程的时候,更不要使用手头的工具。 古怪的习惯很难消逝。

直到最近,所有的操作系​​统都是build立在假定字符是字节的基础上的。 它的API就是这样构build的,工具就是这样构build的,语言就是这样构build的。

是的,如果我写的所有内容已经…错误… UTF-8? UTF-16? UTF-7? UTF-32? 呃……嗯……看来无论你选什么,都会激怒别人。 而事实上,这是事实。

如果你selectUTF-16,那么你所有的数据,就像西方世界的整个经济一样,都会被无缝地读取,因为你失去了ASCII的兼容性。 除此之外,一个字节不再是一个字符,严重破坏了当今软件所依赖的假设。 此外,有些国家不接受UTF-16。 现在,如果select任意可变长度编码,就会破坏许多软件的一些基本前提,例如不需要遍历string来查找第n个字符,就可以从任何一点读取string。

然后,UTF-32 …那么,这是四个字节。 平均硬盘大小或内存大小是多less,但10年前是多less? UTF-32太大了!

所以,唯一的解决scheme是改变一切 – 软件,实用程序,操作系统,语言,工具 – 同时是国际化的意识。 好。 祝“与此同时”

如果我们不能同时做所有的事情,那么我们总是要留意那些不是国内的东西。 这导致恶性循环。

最终用户应用程序比中间件或基本软件更容易,一些新的语言正在以这种方式构build。 但是…我们仍然使用60年代写的Fortran库。 那遗产,它不会消失。

由于UTF-16在UTF-8之前变得stream行,而UTF-16与之合作。 恕我直言

由于对于99%的应用程序,Unicode支持不是客户产品比较matrix上的checkbox。

join等式:

  1. 它需要有意识的努力,几乎没有明显的好处。
  2. 许多程序员都害怕或不理解它。
  3. pipe理层真的不理解或不关心它,至less在客户尖叫之前是这样。
  4. testing团队没有testingUnicode合规性。
  5. “我们没有本地化用户界面,所以非英语的用户不会使用它。”

传统和态度。 ASCII和计算机是许多人的悲哀同义词。

然而,认为Unicode的含义只是欧亚大陆和世界其他地区的外来语言的问题,这是天真的。 丰富的文本编码具有很多意义,甚至可以带来“简单”的英文文本。 有时候看一本书。

我会说主要有两个原因。 首先,简单地说,你的工具的Unicode支持只是没有达到鼻烟。 C ++仍然没有Unicode的支持,直到下一个标准版本才能得到它,这需要一两年的时间才能完成,接下来的五年或十年才会被广泛使用。 许多其他的语言也不会好得多,即使你最终有Unicode支持,使用纯ASCIIstring可能仍然是一个更麻烦的。

第二个原因是它导致了第一个问题,Unicode很难,它不是火箭科学,但是它给了你很多你从来不用ASCII处理的问题。 用ASCII你有一个明确的one byte == one glyph关系,可以用一个简单的str[N]来处理一个string的第N个字符,可以把整个集合的所有字符存储在内存中等等。 使用Unicode,您不再可以这样做,您必须处理Unicode编码(UTF-8,UTF-16,…),字节顺序标记,解码错误,只包含字符子集的大量字体的不同方式你需要完整的Unicode支持,更多的字形,然后你想在给定的时间存储在内存中等等。

ASCII可以通过查看一个ASCII表而不需要任何进一步的文档来理解,而Unicode就不再是这种情况了。

由于C ++造成的惯性。 它有可怕的unicode支持,拖回了开发者。

更多的开销,空间要求。

我怀疑这是因为软件在西方有着如此强大的根基。 如果你恰巧住在美国,UTF-8是一个不错的,紧凑的格式。 但是,如果你住在亚洲,这不是那么热。 ;)

Unicode需要更多的工作(思考),你通常只需要付出所需的东西,所以你走的最快,更简单的select。

那么从我的angular度来看呢。 我想如果你希望代码使用std::wstring hw(L"hello world")你必须解释如何工作,打印wstring你需要wcoutstd::wcout << hw << std::endl; (我认为),(但是, endl似乎很好..)…所以似乎对我来说更多的工作 – 当然,如果我正在写国际应用程序,我将不得不投资于搞清楚,但在那之前,我不我怀疑大多数开发者)。

我想这回归金钱,时间就是金钱。

这很简单。 因为我们的键盘上只有ASCII字符,所以为什么我们会遇到或者关心其他字符呢? 与程序员从来没有想过这个问题,或者从来没有遇到这个问题,或许甚至不知道unicode是什么一样,这不是一种态度。

编辑:换句话说,Unicode是你必须思考的东西,而思考不是大多数人所感兴趣的,甚至程序员。

我个人不喜欢某些格式的unicode打破它,所以你不能再做string[3]得到第三个字符。 当然可以把它抽象出来,但是想象一下,如果一个大的项目比如GCC的话,如果它不得不横过一个string来找出第n个字符的话,会有多慢。 唯一的select是caching“有用的”位置,即使那么缓慢,在某些格式,你现在每个字符好5个字节。 对我来说,这太荒谬了。