[转]用C语言实现UCS-2和UTF-8之间的互相转化
来源:互联网 发布:mac触碰板 编辑:程序博客网 时间:2024/06/03 11:18
本文简单介绍UCS,UNICODE和UTF-8,并利用C语言实现了UTF-8与UCS2之间的互相转化。
1.什么是UCS和ISO10646?
国际标准ISO10646定义了通用字符集(Universal Character Set, UCS).UCS是所有其它字符集标准的一个超集,它保证也其它字符集双向兼容,即编码间相互转换不会丢失任何信息。UCS字符集U+0000到U+007F与US-ASCII是一致的。
2.什么是UNICODE
历史上, 有两个独立的, 创立单一字符集的尝试.一个是国际标准化组织(ISO)的 ISO 10646 项目, 另一个是由(一开始大多是美国的)多语言软件制造商组成的协会组织的 Unicode项目. 幸运的是, 1991年前后, 两个项目的参与者都认识到, 世界不需要两个不同的单一字符集. 它们合并双方的工作成果,并为创立一个单一编码表而协同工作. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2都同意保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何未来的扩展.
3.什么是UTF-8(一种传送和存储格式)
UCS和UNICODE为每个字符分配了一个对应的整数,但并没有明确说明其实现机制.故存在多种编码方式,其中以两个字节和四个字节来存储一个字符的方法分别叫UCS-2,UCS-4,要将一个ASCII文件转换成一个UCS-2文件只要在每个字节前加一个字节0X00,转换成UCS-4只要在每个字节前加三个0X00。
而internet上大量的信息是以ASCII码存在的,如果都用两个字节来存储将浪费大量的资源,同时Unix和Linux下使用USC-2和USC-4会导致严重问题,于是出现了UTF-8(定义于ISO10646-1).
UTF-8(UTF-8 stands for Unicode Transformation Format-8. It is an octet (8-bit) lossless encoding of Unicode characters.)
UNICODE(UCS)和UTF-8的对应关系。
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
在多字节串中,第一个字节的开头‘1’的数目就是整个串中字节的数目.
下面举UCS-2与UTF-8的对应关系,并利用C语言实现之间的互相转化。
-----------------------------------------------------------------------------------------------------------
| UCS2 | UTF-8 |
|----------------------------------------------------------------------------------------------------------
| | code | 1st Byte | 2nd byte | 3rd Byte |
|--------------------------------------------------------------------------------------------------------
| 000000000aaaaaaa | 0000 - 007F | 0aaaaaaa | | |
|--------------------------------------------------------------------------------------------------------
| 00000bbbbbaaaaaa | 0080 - 07FF | 110bbbbb | 10aaaaaa | |
|--------------------------------------------------------------------------------------------------------
| ccccbbbbbbaaaaaa | 0800 - FFFF | 1110cccc | 10bbbbbb | 10aaaaaa |
|--------------------------------------------------------------------------------------------------------
在这儿我只实现了单个字符的转换,串的转换也是一样的道理。
1,把一个UTF-8字符转换成一个UCS-2字符。
如果转换成功返回1,如果UTF-8字符是一个unrecognized字符,则返回0,且存一个blackbox(U+22e0)到ucs2_code_ptr中。
2,把一个UCS-2字符转换成UTF-8字符。函数返回转换成UTF-8的长度(字节1 -- 3),如果目标指针为空,返回0。
字符串间的转换也是一样的。
___________________________________________________________________________________
全文完
URL: http://www.wangchao.net.cn/bbsdetail_34579.html
- [转]用C语言实现UCS-2和UTF-8之间的互相转化
- 用C语言实现UCS-2和UTF-8之间的互相转化
- 利用C语言实现UTF-8与UCS2之间的互相转化
- utf-8和utf-16之间的互相转化
- UCS-2和UTF-8的互相转换
- UCS,UNICODE和UTF-8(包括转化函数)
- UCS-2和UTF-8转换函数
- UCS-2与UTF8之间的选择(5)--断然决定UTF-8
- UCS,UNICODE和UTF-8
- Conversion Between Unicode-UCS-4 And UTF-8 (Unicode-UCS-4 与 UTF-8 之间的转换)
- linux和windows下 unicode、GBK、utf-8 互相转化
- C语言实现atoi和itoa(字符串与数字之间的转化)
- C语言ASCII转UCS-2
- 从ASCII、ISO-8859、GB2312、GBK到Unicode的UCS-2、UCS-4、UTF-8、UTF-16、UTF-32
- ansi、Unicode、Utf-8之间的转化
- c语言:英尺和米之间的转化
- Unicode、UCS和UTF
- 字符串和16进制之间的互相转化
- java 操作串口
- 统一建模语言UML概述(二)
- 自增运算符的副作用
- CentOS 挂载可写NTFS分区
- UML一统天下 ——统一的不是建模过程而是建模语言
- [转]用C语言实现UCS-2和UTF-8之间的互相转化
- 整合Spring与Struts的几种方法
- Struts+Spring+Hibernate练习(完整)
- SQL按照逗号截取
- 《计算机语言妙语录 软件就像性一样》的解读
- 解决Spring2.0向spring2.5迁移的问题(转)
- FusionChart 的javascript 用法
- vc 6.0下实现位图排序
- 关于希尔排序