Unicode(Universal Multiple-Octet Coded Character Set)是一个全世界的字符编码集,是ISO(国际标准化组织)搞的包含地球上所有文字、字符和符号的编码集。 Unicode一般一个字符占4个字节,在内存中以wchar_t类型存储。
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编码10000 0000 - 0000 007F0xxxxxxx20000 0080 - 0000 07FF110xxxxx 10xxxxxx30000 0800 - 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx40001 0000 - 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx50020 0000 - 03FF FFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx60400 0000 - 7FFF FFFF1111110x 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; }