`
thecloud
  • 浏览: 877920 次
文章分类
社区版块
存档分类
最新评论

创造优秀的程序之必备知识:字符编码(2)—软件开发者必须知道的Unicode和字符编码

 
阅读更多

软件开发者必须知道的Unicode和字符编码


这是一篇翻译自Joel Spolsky的文章“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets”,比较经典。

[翻译时为增加可读性,有少许改动]

原文:http://www.joelonsoftware.com/articles/Unicode.html


你曾经因为html文件里的Content-Type标签感到迷惑吗?比如:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
经常见到吧,却不知道它是用来做什么的?

你有没有收到过从外国发来的邮件(比如保加利亚),标题不能正常显示,变成了 "???? ?????? ??? ????"?


令人沮丧的是,我发现很多软件开发者不太了解这个神秘的世界:字符集,字符编码,Unicode等类似的东西。2年前,FogBUGZ beta的一个测试人员想知道这个软件能不能处理处理从日本发来的邮件,用日文写的邮件。[Mark,不太清楚这里要表达的意思]。当查看那些我们用来解析MIME的电子邮件内容时,我发现它完全是用错误的方式来进行字符编码的转换,所以我只能写一段代码来复原那些错误的转换并且从新以正确的方式操作字符编码。

而当我再看到另一个商用的函数库时,没错,关于字符编码相关的实现也很糟糕。我联系到了它的开发者,他说没有什么解决办法。就像很多程序员一样,他也寄希望于那些问题会“自己消失”,真是莫名其妙。

让问题“自己消失”,这是不可能的。When I discovered that the popular web development tool PHP has almostcomplete ignorance of character encoding issues, blithely using 8 bits for characters, making it darn near impossible to develop good international web applications, I thought,enough is enough.

所以我有一个消息要告诉你:如果你现在是一个程序员而且对计算机字符,字符集,编码还有 Unicode的基本内容似乎并不了解。那我就正好逮到你了。我发誓要让你蹲在潜艇里,罚你连续削6个月的圆葱。

我还要告诉你:这些看似高深的东西,其实没有那么难懂。

本文会告诉你每个程序员都应该了解的最基本内容。之前的一切关于“纯文本==ASCII码编码的字符串==每个字符为一个字节的字符串”( "plain text = ascii = characters are 8 bits")不仅是错误的,而且是无可救药地错了。如果你现在还按照这样的方式编写程序,那就像一个医生不相信细菌存在一样。所以在读完本文之前千万不要去写程序了。

在我们开始之前,我应该先提醒你,如果你是那些少数几个了解国际化的人,你可能会觉得以下讨论的内容有一点太简单了。我试着将门槛降到最低,这样所有人都能理解大致原理并且可以写出能操纵任何语言的代码,而不仅仅是英文字符串了。而且我也应该告诉你字符相关的技术只是创造国际化通用软件的一小部分,因为我每次只能写一样东西,所以今天就写了关于字符集、字符编码的内容。

从历史讲起

理解它们最简单的方式就是按照时间顺序叙述它的发展。

但是我们现在不谈EBCDIC,因为它实在太老了,那段历史已经没必要谈了。

Back in the semi-olden days,Unix刚出现的时候,当K&R还在写The C Programming Language的时候,一切都是那么简单。EBCDIC也即将消失。那个时候计算机仅能表示那些不带变音符号(注:欧洲部分语言在字母的顶端有变音符号)的英文字符,我们把它叫做ASCII,在ASCII码表中,从编号32到127承载着所有的字符。空格是32号,字母“A”是65号,等等。因此这些字符能方便地存储在7个2进制位里。那个时候大部分电脑都以8个2进制位为一个字节,所以一个字节里不仅能存储所有的ASCII字符,还有1个2进制位的空位。如果你有点坏,可以把它用在其他邪恶的目的:曾经有个文字处理软件WordStar填补了那个空位,以标定单词的尾部。 编号32以下的称为不可打印字符。它们用来让你发牢骚。哈哈,只是个玩笑而已,其实它们被用作控制字符,比如7可以让电脑蜂鸣,而12可以退出正在打印的页面再装入新的页面。

ASCII table

假设你使用的语言是美国英语,一切看起来似乎都挺好。

由于一个字节里还剩下很多空间,很多人会想到“天哪,我们可以把128到255留给自己用”。问题是,很多人的想法类似,他们按照自己的意愿在128到255之间填充自己的内容。

The IBM-PC had something that came to be known as the OEM character set which provided some accented characters for European languages anda bunch of line drawing characters... horizontal bars, vertical bars, horizontal bars with little dingle-dangles dangling off the right side, etc., and you could use these line drawing characters to make spiffy boxes and lines on the screen, which you can still see running on the 8088 computer at your dry cleaners'. In factas soon as people started buying PCs outside of America all kinds of different OEM character sets were dreamed up, which all used the top 128 characters for their own purposes. For example on some PCs the character code 130 would display as é, but on computers sold in Israel it was the Hebrew letter Gimel (ג), so when Americans would send their résumés to Israel they would arrive as <nobr>r<img alt="ג" src="http://www.joelonsoftware.com/pictures/unicode/gimel.png" border="0" height="9" width="5" style="margin-right:2px">sum<img alt="ג" src="http://www.joelonsoftware.com/pictures/unicode/gimel.png" border="0" height="9" width="5" style="margin-right:2px">s.</nobr> In many cases, such as Russian, there were lots of different ideas of what to do with the upper-128 characters, so you couldn't even reliably interchange Russian documents.

Eventually this OEM free-for-all got codified in the ANSI standard. In the ANSI standard, everybody agreed on what to do below 128, which was pretty much the same as ASCII, but there were lots of different ways to handle the characters from 128 and on up, depending on where you lived. These different systems were called code pages. So for example in Israel DOS used a code page called 862, while Greek users used 737. They were the same below 128 but different from 128 up, where all the funny letters resided. The national versions of MS-DOS had dozens of these code pages, handling everything from English to Icelandic and they even had a few "multilingual" code pages that could do Esperanto and Galician on the same computer! Wow! But getting, say, Hebrew and Greek on the same computer was a complete impossibility unless you wrote your own custom program that displayed everything using bitmapped graphics, because Hebrew and Greek required different code pages with different interpretations of the high numbers.

Meanwhile, in Asia, even more crazy things were going on to take into account the fact that Asian alphabets have thousands of letters, which were never going to fit into 8 bits. This was usually solved by the messy system called DBCS, the "double byte character set" in which some letters were stored in one byte and others took two. It was easy to move forward in a string, but dang near impossible to move backwards. Programmers were encouraged not to use s++ and s-- to move backwards and forwards, but instead to call functions such as Windows' AnsiNext and AnsiPrev which knew how to deal with the whole mess.

But still, most people just pretended that a byte was a character and a character was 8 bits and as long as you never moved a string from one computer to another, or spoke more than one language, it would sort of always work. But of course, as soon as the Internet happened, it became quite commonplace to move strings from one computer to another, and the whole mess came tumbling down. Luckily, Unicode had been invented.




分享到:
评论

相关推荐

    USB开发者的unicode转换器

    这是由我自己用vb编写的一个usb字符串描述符的unicode转换器,可以提供给大家学习学习。 若有问题可以发邮件给我,大家交流交流。 我的邮箱:1173801893@qq.com

    汉字编码转换工具(汉字与utf-8转换 gb2312转换 unicode 转转

    汉字编码转换工具,实现了汉字与 utf-8 gb2312 unicode 互转,开发者多百多度 qq:547170882

    XReplace超级字符串批量替换工具3.8官方最新版.rar

     你好,是否支持大字符集UNICODE字符串的替换?答:可以!从2.7版开始,“超级字符串批量替换工具”新增了从Excel文件读取替换定义进行批量替换的功能。Uincode的字符串可以在Excel文件中进行定义、从而进行替换。...

    用C语言开发手机软件-Windows CE 6.0开发者参考

    1.1.3 Unicode编码 1.1.4 组件化设计 1.1.5 Win32子集 1.2 仍然是Windows编程 1.3 第一个WindowsCE应用程序 1.3.1 创建第一个WindowsCE应用程序 1.3.2 运行程序 1.3.3 出了什么问题 1.4 Hello2程序 1.5 剖析窗口应用...

    用C语言开发手机软件 -Windows+CE+6.0开发者参考

    1.1.3 Unicode编码 1.1.4 组件化设计 1.1.5 Win32子集 1.2 仍然是Windows编程 1.3 第一个WindowsCE应用程序 1.3.1 创建第一个WindowsCE应用程序 1.3.2 运行程序 1.3.3 出了什么问题 1.4 Hello2程序 1.5 剖析窗口应用...

    Unicode Inspector-crx插件

    此扩展程序供那些查看网页上的字符串并且需要知道这些字符串真正包含的内容的人们使用。 (例如,使用基于Web的计算机取证工具的人正在查看可能故意棘手的命令行),这会将所有突出显示的文本撕成其组件Unicode代码...

    MySQL5 权威指南第3版中文版_part1

    本书是MySQL数据库管理员和开发人员的必备参考书。 目录 第一部分 入门  第1章 什么是MySQL  1.1 什么是数据库  1.2 MySQL  1.3 MySQL的不足  1.4 MySQL的版本编号  1.5 MySQL的许可证  1.6 MySQL软件的替代...

    icu4c 50.1.2-docs

    ICU4C提供了C/C++平台强大的国际化开发能力,软件开发者几乎可以使用ICU4C解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、...

    xlslib库源代码供大家下载版本3.23

    此外,xlslib还支持Unicode字符和国际化,支持多语言和字符集。xlslib库还提供了许多高级功能,如动态图表、条件格式、图像、超链接、批注和格式化等。此外,它还支持加密和压缩,以保护工作表的安全性和可靠性。...

    windows驱动开发技术详解-part2

    学习和掌握Windows硬件驱动程序的开发是电子系统设计人员必备的能力。  本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,并且介绍了编 程技巧和应用实例,兼顾了在校研究生和工程...

    js编码器「js Encoder」-crx插件

    开发工具包括...NCR编码器/解码器:对数字字符参考的转换。 XPath测试器:测试xpath结果。 Unicode:Unicode格式CSS压缩器的转换:压缩CSS并将前缀附加到每个选择器 支持语言:English (United States)

    xlnt一个用于读写Microsoft Excel 2007及更高版本(XLSX格式)文件的C++库,本次资源windows下的

    此外,xlnt还支持Unicode字符和国际化,支持多语言和字符集。xlnt库还提供了许多高级功能,如动态图表、条件格式、图像、超链接、批注和格式化等。此外,它还支持加密和压缩,以保护工作表的安全性和可靠性。...

    WEB前端助手(FeHelper)_v6.2.crx

    包括Unicode编码和解码、UTF-8字符串编码和解码、Base64字符串编解码、字符串MD5编码,前端非常实用的工具 图片Base64编码 对图片文件进行base64编码,直接拷贝datauri格式的数据 二维码生成器 能对网址、普通文本...

    MySQL 5权威指南(第3版) 中文版 下载地址

    内容提要 -----------------------------...他写了很多非常成功的计算机图书,内容涉及Visual Basic、Linux、Mathematica和Maple等多种程序设计语言和软件。Kofle还是Definitive Guide to Excel VBA第2版的作者。

    icu4c-50_1_2-src

    ICU4C提供了C/C++平台强大的国际化开发能力,软件开发者几乎可以使用ICU4C解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、...

    ICU4C-Sample.rar_4c理论案例_BiDi算法_IBM ICU4C_ICU4C_阿拉伯语

    ICU4C提供了C/C++平台强大的国际化开发能力,软件开发者几乎可以使用ICU4C解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、...

    Windows驱动开发技术详解的光盘-part1

     从Windows最基本的两类驱动程序的编译、安装、调试入手讲解,非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对...

    icu4c-4_8-src

    ICU4C提供了C/C++平台强大的国际化开发能力,软件开发者几乎可以使用ICU4C解决任何国际化的问题,根据各地的风俗和语言习惯,实现对数字、货币、时间、日期、和消息的格式化、解析,对字符串进行大小写转换、整理、...

Global site tag (gtag.js) - Google Analytics