Unicode
Unicode(Universal Multiple-Octet Coded Character Set)是一个全世界的字符编码集,是ISO(国际标准化组织)搞的包含地球上所有文字、字符和符号的编码集。
Unicode一般一个字符占4个字节,在内存中以wchar_t类型存储。
UTF-8
UTF-8(Unicode Transformation Format),是一种变长编码方式,最小单位为1个字节长度。
一个Unicode无论实际内容是什么,都需要占用4个字节,不便于在网络中传输。而UTF-8变长编码,可以根据Unicode的内容,使用1-6个字节灵活对Unicode进行编码。
例如,一个ASCII字符对应的Unicode码,采用UTF-8编码后只占用1个字节;一个汉字对应的Unicode码,采用UTF-8编码后占用3个字节。这样大大提高了传输效率。
Unicode的码对应UTF-8编码结果:
字节数 | Unicode符号 | UTF-8编码 |
---|---|---|
1 | 0000 0000 - 0000 007F | 0xxxxxxx |
2 | 0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx |
3 | 0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
4 | 0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
5 | 0020 0000 - 03FF FFFF | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
6 | 0400 0000 - 7FFF FFFF | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
例子
如下是一个简单的中文+英文 UTF-8编码序列转Unicode的示例。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdint.h>
#include <wchar.h>
/*
* 功能:UTF-8转Unico
* 输入:uint8_t *src,只包含中英文字符、标点符号的UTF-8序列首指针
* 输出:wchar_t *dst,Unicode字符数组首指针
* 返回值:-1 - 转换失败;大于0 - 实际转换成功的Unicode的字符个数
*/
int Utf82Unicode(uint8_t *src, wchar_t *dst) {
int src_i;
int dst_i;
size_t len;
if (NULL == src || NULL == dst) {
return -1;
}
len = strlen((const char *)src);
src_i = 0;
dst_i = 0;
while (src_i < len) {
if (((src[src_i] & 0xf0) == 0xe0) &&
(src[src_i + 1] != '\0') &&
(src[src_i + 2] != '\0')) {
dst[dst_i] = (src[src_i] & 0x1F) << 12;
dst[dst_i] |= (src[src_i + 1] & 0x3F) << 6;
dst[dst_i] |= (src[src_i + 2] & 0x3F);
dst_i += 1;
src_i += 3;
} else {
dst[dst_i ++] = src[src_i ++];
}
}
return dst_i;
}