Extreme Thinking
各种程序语言的unicode支持

2014-12-19


1. XML/HTML

XML及其子集XHTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进制Unicode代码。

2. Java

Java内部是Unicode编码,具体一点就是,Java的class文件采用UTF-8,JVM内部采用UTF-16编码。

byte and char

byte就是8bit组成的一个字节,是一个物理概念,char是一个unicode字符(JVM使用UTF-16编码),byte是有编码的,可能是各种各样的编码,GBK,UTF-8,ISO-8859-1等,char都是unicode的,从存储空间角度而言,一个char可能是2个byte的大小,string是由一组char组成的,处理char和string时无需考虑编码问题,Java能够正确处理各种char/string相关的各种函数,但byte和char互转时需要考虑编码问题。

char转成byte需要encoding,byte转成char需要decoding,下面几个地方需要考虑编码问题:

  • File IO,需要从文件系统读取内容,或需要将内容存到硬盘时,硬盘上的文件编码可能是UTF-8或GBK等,需要与Unicode转换
  • Networking IO,Socket等网络编程时,web表单提交等web编程时

File IO方法中,对应的是InputStream/OutputStream和Reader/Writer,stream操作的是byte,reader/writer操作的是char。

更多阅读: http://fgaliegue.blogspot.com/2014/03/strings-characters-bytes-and-character.html

.java to .class

Java源文件一般为平台相关编码,譬如GBK,编译成class文件时,要确保编码转换正确。这一步IDE一般会处理。

.ini file

Java中的属性文件只支持iso-8859-1编码格式,因此,要想在属性文件中保存中文,需要在属性文件里使用U+xxxx的格式。

3. JavaScript

JavaScript内部支持Unicode,但只支持2字节的UFT-16编码,即UCS-2编码,这是因为JavaScript面世的时候UTF-16还没有出来。

由于JavaScript只能处理UCS-2编码,造成所有字符在这门语言中都是2个字节,如果是Unicode辅助平面上的字符,4个字节的字符,会当作两个双字节的字符处理。JavaScript的字符函数都受到这一点的影响,无法返回正确结果。

更多阅读: http://www.ruanyifeng.com/blog/2014/12/unicode.html