关于不可知的语言:您是否精通Unicode?

关于不可知的语言:您是否精通Unicode?

Are you fluent in Unicode yet?

大约5年前,Joel Spolsky写了这篇文章,"绝对绝对是每个软件开发人员绝对肯定要知道的Unicode和字符集(无借口!)"。

像许多人一样,我仔细阅读了一下,意识到这是我不得不处理这种" ASCII替换"的时候了。不幸的是,五年后,我觉得我在这个领域陷入了一些坏习惯。你有吗

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

因此,出于我的利益(我相信还有许多其他人),我可以从以下方面得到一些人的意见:

  • 如何一劳永逸地"克服" ASCII
  • 使用Unicode的基本指导。
  • 推荐(最新)有关Unicode的书籍和网站(面向开发人员)。
  • Unicode的当前状态(在Joels的文章发表5年后)
  • 未来发展方向。

我必须承认我具有.NET背景,因此也希望获得.NET框架中有关Unicode的信息。当然,这不应阻止具有不同背景的任何人发表评论。

更新:请参阅以前在StackOverflow上也问过的相关问题。


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

这里有一些有趣的文章(除了乔尔的文章):

  • http://www.tbray.org/ongoing/When/200x/2003/04/06/Unicode
  • http://www.tbray.org/ongoing/When/200x/2003/04/26/UTF

引用第一篇文章;使用Unicode的技巧:

  • 拥抱Unicode,不要打架;这可能是正确的做法,如果不是,则可能无论如何都必须这样做。
  • 在您的软件中,将文本存储为UTF-8或UTF-16;也就是说,选择两者之一并坚持下去。
  • 尽可能使用XML与外界交换数据;这样就消除了很多潜在的问题。
  • 尝试使您的应用程序基于浏览器,而不是编写自己的客户端;浏览器在处理世界文本方面确实变得非常擅长。
  • 如果您使用的是别人的库代码(当然是这样),请假设其Unicode处理已损坏,直到证明是正确的为止。
  • 如果您要进行搜索,请尝试将语言和字符处理问题交给了解它们的人。
  • 前往亚马逊或其他地方购买印刷版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进行读取(我肯定StreamReader和< x1>以此方式运行。)对于不懂BOM的"笨拙"文本编辑器来说,这是相当安全的,但对于那些可能会显示UTF-8或实际上您正在编写超出标准的字符的更聪明的文本编辑器来说,这是一种粗鲁的选择。 ASCII范围。

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

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

每当我看到有人问"我如何获取字符串的字节?"时,这会让我哭泣。和建议的解决方案使用Encoding.ASCII.GetBytes() :(


经验法则:如果您从不修改或查看字符串内部,而是严格地将其视为数据块,那么您的状况会更好。

如果您想以" Unicode方式"进行操作,则即使进行拆分单词或小写字符串之类的简单操作也变得很困难。

而且,如果您要以" Unicode方式"进行操作,则需要一个非常好的库。这些东西非常复杂。


推荐阅读

    c语言写linux命令?

    c语言写linux命令?,系统,工具,代码,智能,工作,环境,情况,位置,命令,文件,如何

    linux汇编语言命令?

    linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇

    linux替换日志命令?

    linux替换日志命令?,服务,系统,软件,代码,信息,文件,日志,首次,可取,工具,lin

    linux汇编语言命令?

    linux汇编语言命令?,系统,地址,代码,数据,网络,平台,平均,位置,灵活,工作,汇

    linux命令替换字符串?

    linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

    linux中替换单词命令?

    linux中替换单词命令?,资料,状态,工作,数据,命令,模式,文本,内容,单词,字符

    linux中替换字符命令?

    linux中替换字符命令?,工作,地址,系统,命令,资料,数据,信息,商业,管理,目录,L

    linux命令是什么语言?

    linux命令是什么语言?,系统,环境,代码,传播,管理,语言,操作系统,源码,自由,

    linux替换文本命令?

    linux替换文本命令?,信息,系统,命令,内容,文件,文本,字符串,字符集,单词,字

    linux命令替换后门?

    linux命令替换后门?,系统,数据,工具,平台,工作,检测,最新,管理系统,通信,商

    linux替换文本的命令?

    linux替换文本的命令?,系统,地址,工作,信息,命令,标准,数据,内容,文件,字符

    linux命令被替换入侵?

    linux命令被替换入侵?,系统,密码,数据,合法,服务,检测,分析,网站,网络,异常,

    linux下替换文件命令?

    linux下替换文件命令?,文件,一致,评论,名称,标的,资料,工作,命令,字符串,内

    linux改语言命令行?

    linux改语言命令行?,系统,环境,工具,密码,概念,地方,软件,通信,管理,国际,lin

    linux命令行c语言?

    linux命令行c语言?,代码,系统,工具,环境,工作,保险,发行,命令,文件,终端,linu

    c语言在linux命令?

    c语言在linux命令?,系统,工作,管理,命令,保险,基础,环境,信息,文件,语言,linu

    ab替换命令linux?

    ab替换命令linux?,名称,网络,地址,标准,命令,文件,信息,第一,数据,字符串,vim

    linux编写c语言命令?

    linux编写c语言命令?,系统,基础,环境,代码,盘面,保险,百度,情况,数据,工具,在

    linux命令替换怎么用?

    linux命令替换怎么用?,数据,字符串,命令,系统,文件,批量,内容,方法,字符集,

    linux下s替换命令?

    linux下s替换命令?,系统,命令,状态,工作,数据,首次,字符串,文件,内容,模式,li