当前位置:  技术问答>linux和unix

关于unicode 的问题

    来源: 互联网  发布时间:2015-08-02

    本文导语:  有没有这样的一个函数  bytes hello[] = GetUnicodeBytes("中国"); 就能得到是“中国”这两个字的unicode 编码的byte数组。 | 如何(在程序中)加入并使用 Unicode 以实现外语支持  Thomas W. Burger (twburger@bigfo...

有没有这样的一个函数  bytes hello[] = GetUnicodeBytes("中国");
就能得到是“中国”这两个字的unicode 编码的byte数组。

|
如何(在程序中)加入并使用 Unicode 以实现外语支持 
Thomas W. Burger (twburger@bigfoot.com)
Thomas Wolfgang Burger Consulting 的老板
2001 年 8 月

作为一个计算机的多字节字符表示系统,Unicode 支持世界上所有语言的编码和转换。这篇文章说明了 Linux 应用程序中的国际语言支持的重要性,以及设计 Unicode 支持并将之结合到 Linux 应用程序中去的思想。
Unicode 并不只是一个编程工具,它还是一个政治的、经济的工具。没有结合世界的语言支持的应用程序通常只能被那些能读写 ASCII 所支持语言的个人使用。这使得建立在 ASCII 基础之上的计算机技术脱离了世界上大部分人。Unicode 允许程序使用世界上任何一种字符集,因此它支持所有语言。 

Unicode 让程序员为普通人提供用他们本国语言就能使用的软件。这样就不用再学一门外语了,而且更容易实现计算机技术社会和财政上的利益。很容易设想,如果用户必须为使用因特网浏览器而学习乌尔都语的话,您就难以看到计算机在美国的使用。Web 就更不会出现了。

Linux 承担了对 Unicode 很大程度上的支持。Unicode 支持被嵌入到内核和代码开发库中。在很大程度上,使用程序中几句简单的命令就能将它们自动的结合到代码中。 

所有现代字符集的基础都是在 1968 年以 ANSIX3.4 版本出版的美国信息交换标准码(American Standard Code for Information Interchange,ASCII)。一个值得注意的例外是在 ASCII 之前定义的 IBM 的扩充的二进制编码的十进制交换码(Extended Binary Coded Decimal Information Code,EBCDIC)。ASCII 是一个编码字符集(coded character set,CCS),换句话说,它是整数到字符表示的映射。ASCII 编码字符集允许用一个八位(基于二进制的,用值 0 或 1 表示的)字段或字节(2^8 =256)表示 256 个字符。这是一个高度受限的编码字符集,它不能表示许多不同语言的所有字符(如中文和日文),不能表示科学符号,更不能表示古代文字(神秘符号和象形文字)和音乐符号。通过更改一个字节的长度而使更大的字符集得以被编码,这似乎有效但完全不切实际。所有的计算机都基于八位字节。解决方法是一种字符编码方案(Character encoding scheme,CES)— 用定长或变长的多字节序列能够表示比 256 大的数.这些数值接着通过编码字符集被映射到它们表示的字符。

Unicode 的定义
Unicode 通常用作涉及双字节字符编码方案的通用术语。Unicode CCS 3.1 的官方称谓是 ISO10646-1 通用多八字节编码字符集(Universal Multiple Octet Coded Character Set,UCS)。Unicode 3.1 版本添加了 44,946 个新的编码字符。算上 Unicode 3.0 版本已经存在的 49,194 个字符,共计 94,140 个。

Unicode 编码字符集利用了一个由 128 个三维的组构成的四维编码空间。其中每个组包含 256 个二维平面。每个平面由 256 个一维的行组成,并且每个行有 256 个单元。每个单元在这个编码空间内对一个字符编码,或者被声明为未经使用。这种编码概念被称为 UCS-4;四个八位元用来表示指定组、平面、行和单元的每个字符。 

第一个平面(第 00 组的第 00 平面)是基本多语言平面(Basic Multilingual Plane,BMP)。BMP 按字母、音节、表意符号和各种符号及数字定义了常规使用的字符。后续的平面用于附加字符或其它还没有发明的编码实体。我们需要这完整的范围去处理世界上的所有语言;特别是拥有将近 64,000 个字符的一些东亚语言。 

BMP 被用作双字节的编码字符集,这种编码字符集确定为 ISO 10646 UCS-2 格式。ISO 10646 UCS-2 就是指 Unicode(并且两者相同)。BMP,像所有 UCS 平面那样,包含了 256 行,其中每行包含 256 个单元,字符仅仅按照 BMP 中的行和单元的八位元在单元中被编码。这就允许 16 位编码字符能够被用来书写大多数商业上最重要的语言。UCS-2 不需要代码页切换、代码扩展或代码状态。UCS-2 是一种将 Unicode 结合到软件中的简单方法,但它只限于支持 Unicode BMP。 

若要用 8 位字节表示一个多于 2^8 =256 个字符的字符编码系统(character coding system,CCS),就需要一种字符编码方案(character-encoding scheme,CES)。

Unicode 转换
在 UNIX 中,使用得最多的字符编码方案是 UTF-8。它考虑到了对整个 Unicode 全部页和平面的全面支持,而且它仍能正确的识别 ASCII。除了 UTF-8 的其他选择还有:UCS-4、utf-8、UTF-7.5、UTF-7、SCSU、HTML 和 JAVA。

Unicode 转换格式(Unicode Transformation Formats,UTFs)是一种通过映射多字节编码中的值来支持 Unicode 的字符编码方案。本文将分析最流行的格式 — UTF-8 字符编码系统。

UTF-8
UTF-8 转换格式正逐步成为一种占主导地位的交换国际文本信息的方法,因为它可以支持世界上所有的语言,而且它还与 ASCII 兼容。UTF-8 使用变长编码。从 0 到 0x7f(127)的字符把自身编码成单字节,而将值更大的字符编码成 2 到 6 个字节。

表 1. UTF-8 编码

0x00000000 - 0x0000007F: 0xxxxxxx 
0x00000080 - 0x000007FF: 110xxxxx 10xxxxxx 
0x00000800 - 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx 
0x00010000 - 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
0x00200000 - 0x03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
0x04000000 - 0x7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

字节 10xxxxxx 是一个扩展字节,它的 xxxxxx 位位置被以二进制表示的字符代码号的位所填充。这是能够代表被使用代码的最短的可能的多字节序列。 

UTF-8 编码示例
Unicode 字符版权标记字符 0xA9 = 1010 1001 用 UTF-8 编码如下所示:

11000010 10101001 = 0xC2 0xA9 
“不等于”符号字符 0x2260 = 0010 0010 0110 0000 编码如下所示:

11100010 10001001 10100000 = 0xE2 0x89 0xA0 
通过获取 continuation byte 的值可以看到原始数据:

[1110]0010 [10]001001 [10]100000 
0010 001001 100000 
0010 0010 0110 0000 = 0x2260 
第一个字节定义后面紧跟的八位元数,如果是 7F 或更小,这就是等价的 ASCII 值。每个八位字节以 10xxxxxx 开头,确保字节不与 ASCII 的值混淆

|
其实,你可以自己写这样一个函数来完成。你可以查看一些关于gb2312转换成unicode的资料!难度不是太大,应该很简单!就是两张表之间的转换!

|
static size_t 
encode_conv(const char* tocode, const char* fromcode, 
    char* inbuf, size_t* inlen, 
    char* outbuf, size_t* outlen)
{
size_t rs;
size_t out;
iconv_t handle;

if ( (inbuf == NULL) || (inlen 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.util.regex类pattern的类成员方法: unicode_case定义及介绍
  • 怎么把字符串转为:unicode 编码?又如何把unicode编码转为字符串(有中文)?
  • java命名空间javax.sql.rowset类baserowset的类成员方法: unicode_stream_param定义及介绍
  • 解决无法在unicode和非unicode字符串数据类型之间转换的方法详解
  • PHP实现Unicode和Utf-8互相转换
  • php unicode解码工具(unicode编码转换器)
  • CSS unicode-bidi 属性
  • 如何实现mbcs转换unicode,unicode转换成utf8
  • 如何输出所有的ASCII码或Unicode字符?如何得到a,b等的ASCII码或Unicode?
  • php制作unicode解码工具(unicode编码转换器)代码分享
  • unicode & 多语言???
  • UniCode在网上怎么查呀?
  • Unicode库 Unicode.php
  • linux下怎么获得字符串的unicode码?
  • 如何让GCC支持unicode16
  • UNIX支持UNICODE否?
  • Unix下Unicode编码和gb的转化如何实现?急!!
  • 在UNIX下如何将ASCII码转换成UNICODE码,急!急!急!急!
  • linux下如何把字符串转换为Unicode?
  • 求助java中如何在unicode和GBK2312之间转换
  • 哪位大虾能告诉我unicode中中文段的值?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3