Unicode与UTF-8

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编码
10000 0000 - 0000 007F0xxxxxxx
20000 0080 - 0000 07FF110xxxxx 10xxxxxx
30000 0800 - 0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
40001 0000 - 0010 FFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
50020 0000 - 03FF FFFF111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
60400 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值