Unicode和多语言信息处理

Download Report

Transcript Unicode和多语言信息处理

Unicode和多语言信息处理
adoal
内容
早期的本地化技术
软件国际化和多语言信息处理的需求
常见字符集、编码介绍
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×2562)=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范围
UTF-8编码
00000000~0000007F
0xxxxxxx
00000080~000007FF
110xxxyy 10yyyyyy
00000800~0000FFFF
1110xxxx 10xxxxyy 10yyyyyy
00010000~001FFFFF
11110xxx 10xxyyyy 10yyyyzz 10zzzzzz
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