资源描述
Unicode和多语言信息处理,,内容,早期的本地化技术
软件国际化和多语言信息处理的需求
常见字符集、编码介绍
Unicode Technology 简介
开发支持Unicode的程序
Internet 时代的多语言信息处理
相关资源
不涉及文字消息(界面)本地化,早期的本地化技术,问题的历史起因
电子计算机源起于英美,较少考虑国际需求
早期不面向普通用户,无交互
早期的本地化努力
互相独立缺乏沟通合作
逆向工程、外挂,支持不彻底
应用软件要做个例修改,缺乏复用
早期汉化的重要成果:GB2312 标准,基于国际化的本地化,抽象出共同部分做成框架,应用程序接口,国际化核心功能,本地化数据定义接口,英文定义,俄文定义,中文定义,……,文字处理,数据库,多媒体,……,基于国际化的本地化-续,成果
抽象框架,功能复用,简化开发过程
可加载的本地化模块,易于扩展
宽字符机制,避开多字节编码的字节边界
缺陷
编码空间不兼容,导致“乱码”
即使使用宽字符,不同语言的文字也无法共同处理,乱码一例,GBK
Byte1 : [0x81, 0xFE]
Byte2 : [0x40, 0xFE]
Latin-1
Single byte : [0xA0, 0xFF]
序列 0xF1,0x61 如何解释?
在GBK里是馻
在Latin-1里是ña,馻,ña,多语言需求的解决方法,问题:字符集太小
解决:设计大字符集并预留扩充位
问题:编码空间冲突
解决:设计新的编码方式
有状态编码,使用转义序列局部兼容性,编程复杂
无状态编码,为每个编码点保留唯一编码值需要码表转换,编程简单,常见字符集和编码,ASCII
American Standard Code for Information Interchange
起源于美国国会图书馆
等同于 ISO 646
包含英文大小写字母、阿拉伯数字、标点符号、控制符
7位编码
是后来各种字符集、编码的兼容性参考,常见字符集和编码-续,ISO-8859
扩充了ASCII,加入欧洲语言的字母和符号
8位编码,扩充部分在b7=1的区域,避开控制符,与ASCII兼容
分为多个扩展集,适应不同文字
ISO-8859-1 西欧
ISO-8859-5 西里尔语
ISO-8859-7 希腊语
ISO-8859-15 增加欧元符号
……,常见字符集和编码-续,亚洲语言的字符集
中国大陆:GB系列
中国台湾:CNS、Big5
日本:JIS X
韩国:KSC
大字符集:CCCII、ANSI Z39.64、ISO 10646
亚洲语言的编码系统
ISO-2022 多七位编码
EUC 多八位编码
双字节编码:Shift JIS、GBK、Big5
Unicode类编码
其它:HZ-GB-2312、GB18030、TRON、ANSI Z39.64等,Unicode Technology,Unicode是什么?
Unicode provides a unique number for every character,no matter what the platform,no matter what the program,no matter what the language.
关于字符集、编码的一系列相关标准和处理技术的总和,Unicode Technology-续,Unicode的起源与发展
发起者:Xerox、Apple、IBM、Microsoft、Sun、DEC、Novell等
Unicode与ISO-10646的竞争
ISO 10646:4个8位元定长,避开控制区C0和C1,不要求b7都为0或1
Unicode:直接使用16位元,不避C0和C1
Unicode与ISO-10646的统一
ISO 10646放弃避开控制区的方式
Unicode并入ISO 10646的字面0,使用多八位元表示
Unicode版本在不断更新
增加新的字符,修正错误,Unicode Technology-续,字符索引值的结构
0ggggggg pppppppp rrrrrrrr cccccccc
b31固定为0
7位群(group)索引,8位面(plane)索引,8位行(row)索引,8位格(cell)索引
每个面的0xFFFE和0xFFFF值保留
总共可收录的字数为128×256×(256×256-2)=2,147,418,112个,Unicode Technology-续,Unicode的字符集
UCS: Universal Multiple-Octet Coded Character Set
BMP: Basic Multilingual Plane即Plane 0
UCS-2
BMP的字符集
相当于早期的Unicode,Unicode Technology-续,Unicode BMP字符子集
0000~007F: ASCII
0080~00A0: C1控制码
00A1~1FFF: 拼音文字
2000~28FF: 符号
2E80~33FF: 中日韩符号(部首、注音符号、日文假名、带括号数字等)
3400~4DFF: 中日韩表意文字扩充区
4E00~9FFF: 中日韩表意文字主区(20902个汉字)
A000~A4FF: 彝族文字,AC00~D7FF: 韩文拼音组合字
D800~DFFF: 代用对,专用于UTF-16
E000~F8FF: 私有区,用于自造字
F900~FAFF: 中日韩兼容表意文字区
FB00~FFFD: 文字表现形式区(竖排标点、全角字符等)
BMP外的字符子集
Plane1: 其它非表意文字
Plane2: 中日韩扩充文字和CNS11643兼容字,Unicode Technology-续,Unicode的编码方式
Unicode Transformation Format
目的: 效率、兼容性
UTF-32
直接用一个32位元表示一个UCS字符
UTF-16
用1~2个16位元表示一个UCS字符
BMP字符为1个16位元,其它面字符用代用对
UTF-8
用1~4个8位元表示一个UCS字符,理论上是6个
ASCII为1个8位元,大部分拼音文字用2个8位元,表意文字用3个8位元,BMP之外的面用4个8位元
Java里的UTF-8可能出现6个8位元,是历史原因,目前已定义的Unicode字符至多用到4个,Unicode Technology-续,UTF-8的编码规则,Unicode Technology-续,字节序
用多八位元表示16位或32位整数
Big-endian、Little-endian
字节顺序标记
数值: FEFF
UTF-16BE: FE FF
UTF-16LE: FF FE
UTF-8: EF BB BF,开发支持Unicode的程序,操作系统和运行时库的Unicode支持
Windows NT Family的Win32子系统
内部全面支持Unicode,内核、设备驱动、文件系统接口都使用Unicode
User level API全面支持Unicode,同时提供非Unicode的API兼容16位Windows下的源代码
Unicode文本使用UTF-16编码
Unicode IME:码表、微软输入法、拼音加加3.1
Windows 9X的Unicode API只提供了入口,内部没有实现,调用则返回错误代码,开发支持Unicode的程序-续,操作系统和运行时库的Unicode支持-续
开放系统
各类Unix系统的syscall、vfs等涉及文本的地方都是char*,因此最好的折中方式是UTF-8
glibc的wide char是UTF-32编码,但只适用于GNU系统;其它系统的libc未必如此
XFree86/Xorg在保留复杂的X11复合文本的同时引入Xutf8系列API支持Unicode
gnome使用UTF-8作为内部编码,KDE通过QString支持Unicode
scim输入平台全面支持Unicode,开发支持Unicode的程序-续,Windows的双模API
文档中的原型
BOOL SetWindowText(HWND hWnd, LPCTSTR lpString);
实际原型
BOOL SetWindowTextA(HWND hWnd, LPCSTR lpString);
BOOL SetWindowTextW(HWND hWnd, LPCWSTR lpString);
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif,开发支持Unicode的程序-续,用MSLU开发支持Unicode的软件
原理
在NT上直接调用-W API
在9X上截取-W系列API的调用转为-A系列API
好处与局限性
在NT上不损失任何功能和性能,在9X上正常运行
支持的API不够完整,有些需要自己重载
并不能给9X带来支持Unicode的能力
出现太晚,大多数第三方软件开发商不支持
其它选择
双版本可执行程序
自己写自适应层,开发支持Unicode的程序-续,编程语言/开发环境对Unicode的支持
C和C++
wide char并不保证字符集和编码方式
ISO C99提供了可选的ISO10646支持
必要时可借助IBM的ICU
Java
从一开始设计就支持Unicode
早期UCS-2,后来通过UTF-16全面支持
Delphi
以兼容性为借口不在VCL中支持Unicode
TntTWare Delphi Unicode Controls
开源社区的脚本语言
积极支持Unicode,开发支持Unicode的程序-续,Internet与Unicode
HTML用Unicode作为字符集
Email信头和信体的编码设定
IMAP协议用变种UTF-7传送邮件夹名称
LDAPv3使用UTF-8传送文本
SFTP使用UTF-8传送文件名
多语种域名解析系统
IETF建议以后新发明的协议和URI表示法都支持UTF-8,相关资源,乱码大全 - bluesea@smth
CJK.INF & CJKV Information Procesing - Ken Lunde
Unicode与ISO10646 -曾士熊
UTF-8 and Unicode FAQ (for Linux) – Markus Kuhn
Developing International Software (中译版《国际化软件开发》) – Microsoft Corp.
MSDN Library – Microsoft Corp.
RFC中的相关篇目 - IETF,
展开阅读全文
相关搜索