250 likes | 469 Views
Unicode 和多语言信息处理. adoal. 内容. 早期的本地化技术 软件国际化和多语言信息处理的需求 常见字符集、编码介绍 Unicode Technology 简介 开发支持 Unicode 的程序 Internet 时代的多语言信息处理 相关资源 不涉及文字消息(界面)本地化. 早期的本地化技术. 问题的历史起因 电子计算机源起于英美,较少考虑国际需求 早期不面向普通用户,无交互 早期的本地化努力 互相独立缺乏沟通合作 逆向工程、外挂,支持不彻底 应用软件要做个例修改,缺乏复用 早期汉化的重要成果: GB2312 标准.
E N D
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×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 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 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