Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 你精通Unicode了吗?_Language Agnostic_Unicode_Internationalization_Ascii - Fatal编程技术网

Language agnostic 你精通Unicode了吗?

Language agnostic 你精通Unicode了吗?,language-agnostic,unicode,internationalization,ascii,Language Agnostic,Unicode,Internationalization,Ascii,大约5年前,乔尔·斯波尔斯基写了这篇文章 和许多人一样,我仔细阅读了它,意识到现在正是我着手解决“ASCII替代品”问题的时候了。不幸的是,5年后,我觉得自己在这方面又养成了一些坏习惯。有吗 我没有写很多专门的国际应用程序,但是我帮助建立了许多面向ASP.NET互联网的网站,所以我想这不是一个借口 因此,为了我的利益(我相信还有许多其他人),我可以从人们那里获得以下方面的一些信息: 如何一劳永逸地“克服”ASCII码 使用Unicode时的基本指导 推荐的(最近的)关于Unicode的书籍和网

大约5年前,乔尔·斯波尔斯基写了这篇文章

和许多人一样,我仔细阅读了它,意识到现在正是我着手解决“ASCII替代品”问题的时候了。不幸的是,5年后,我觉得自己在这方面又养成了一些坏习惯。有吗

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

因此,为了我的利益(我相信还有许多其他人),我可以从人们那里获得以下方面的一些信息:

  • 如何一劳永逸地“克服”ASCII码
  • 使用Unicode时的基本指导
  • 推荐的(最近的)关于Unicode的书籍和网站(供开发人员使用)
  • Unicode的当前状态(Joels文章发表后5年)
  • 未来方向
我必须承认我有.NET背景,因此我也很乐意在.NET框架中获得有关Unicode的信息。当然,这不应该阻止任何背景不同的人发表评论


更新:请参阅之前关于StackOverflow的提问。

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


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

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

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

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

  • 拥抱它,不要反抗;这可能是正确的做法,如果不是这样的话,你无论如何都可能不得不这样做
  • 在软件内部,将文本存储为UTF-8或UTF-16;也就是说,从这两种方法中选择一种并坚持下去
  • 尽可能使用XML与外部世界交换数据;这使得一大堆潜在的问题消失了
  • 尝试使应用程序基于浏览器,而不是编写自己的客户端;浏览器真的很擅长处理世界上的文本
  • 如果您正在使用其他人的库代码(当然您也是),则假定其Unicode处理被破坏,直到证明是正确的
  • 如果你在做搜索,试着把语言和字符处理问题交给理解它们的人
  • 去亚马逊或其他地方购买最新版本的印刷版Unicode标准;它包含了你需要知道的一切
  • 花些时间浏览Unicode网站,学习代码图表是如何工作的
  • 如果你要认真研究亚洲语言,那就去买肯·伦德(Ken Lunde)的奥莱利(O’Reilly)这本书
  • 如果你有一台Macintosh电脑,那就去拿Lord Pixel的Unicode字体检查工具。很酷
  • 如果你真的要放下手头的数据,去参加一个每年两次的Unicode会议。所有的专家都去了,如果你不知道你需要知道什么,你可以在那里找到知道的人

经验法则:如果你从不咀嚼或查看字符串内部,而是严格地将其视为一团数据,那么你会过得更好

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


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

NET Framework使用Windows默认编码来存储字符串,结果是UTF-16。如果您在使用大多数文本I/O类时没有指定编码,那么您将在没有BOM的情况下编写UTF-8,并通过首先检查BOM然后假设UTF-8进行读取(我确信
StreamReader
StreamWriter
的行为是这样的。)这对于“dumb”来说是非常安全的文本编辑器不理解BOM,但对于智能编辑器来说有点粗糙,可能会显示UTF-8或实际写入的字符超出标准ASCII范围

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

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


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

平心而论,大写字母和类似的单词对我们来说才有意义,因为我们是英国人,使用ASCII。即使没有unicode,要让它按照用户的期望工作也是一个非常复杂的练习。更改大小写非常棘手,甚至Win32 api函数
CharUpper
也承认它有时会出错,您应该使用
>LCMapString