utf8 ucs4

这个问题不好回答,首先UTF-8编码只不过是一种Unicode的转换,兼容ASCII。
所以,UTF-8编码支持的最大字符编码应该是Unicode支持的最大字符编码。

理论上,UTF-8编码可以支持最大6字节:
00000000-0000007F 0xxxxxxx
00000080-000007FF 110yyyxx 10xxxxxx
00000800-0000FFFF 1110yyyy 10yyyyxx 10xxxxxx
00010000-001FFFFF 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx
00020000-03FFFFFF 111110aa 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx
04000000-7FFFFFFF 1111110a 10aaaaaa 10zzzzzz 10zzyyyy 10yyyyxx 10xxxxxx

UCS4最多可以表示2^32个字符,但UTF-8最多只能表示2^31个字符,现实当中,Unicode规范根本就还没有规定这么多字符,目前最多也就规定到Plane 16,最多1114111个字符,所以网上关于UTF-8编码,大多截止到4字节:
00000000-0000007F 0xxxxxxx
00000080-000007FF 110yyyxx 10xxxxxx
00000800-0000FFFF 1110yyyy 10yyyyxx 10xxxxxx
00010000-0010FFFF 11110zzz 10zzyyyy 10yyyyxx 10xxxxxx

Unicode规范规定,10FFFE和10FFFF作为内部保留,所以Plane 16支持的最大字符编码是:10FFFD
转换成UTF-8编码是:F48FBFBD

但是,到底这个字符能否正常显示出来,还要看你系统里装的字体到底支持多少字符。

所以,“utf-8里现在已经用到的字符最大编码是多少”这个问题的答案依赖于Unicode规范的版本、具体字体字库的支持。

0x00-0x7F  同ASCII,也不可能作为任何其他多字节UTF-8字符的一部分
0xC0-0xDF  多字节UTF-8字符的开始字节,而且据此可以判断出该UTF-8字符的长度(字节数)
0x80-0xBF  多字节UTF-8字符的跟随字节
0xFE-0xFF  UTF-8未使用

> 字节数 位数 表示
> 1 7 0bbbbbbb
> 2 11 110bbbbb 10bbbbbb
> 3 16 1110bbbb 10bbbbbb 10bbbbbb
> 4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb
> 5 26 111110bb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb
> 6 31 1111110b 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb
> 7 36 11111110 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb
> 8 42 11111111 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb 10bbbbbb

typedef uint8 utf8;
//typedef    uint16    utf16; // removed typedef to prevent usage, as utf16 is not supported (yet)
typedef    uint32    utf32;

// return number of code units in a null terminated string
    size_type utf_length(const utf8* utf8_str) const
    {
        size_type cnt = 0;
        while (*utf8_str++)
            cnt++;

        return cnt;
    }

    // return number of code units in a null terminated string
    size_type utf_length(const utf32* utf32_str) const
    {
        size_type cnt = 0;
        while (*utf32_str++)
            cnt++;

        return cnt;
    }

上面是计算utf8所占的字节数和 utf32 占用的字节数

// return number of utf32 code units required to re-encode given utf8 data as utf32.  len is number of code units in ‘buf‘.
    size_type encoded_size(const utf8* buf, size_type len) const
    {
        utf8 tcp;
        size_type count = 0;

        while (len--)
        {
            tcp = *buf++;
            ++count;
            size_type size = 0;

            if (tcp < 0x80)
            {
            }
            else if (tcp < 0xE0)
            {
                size = 1;
                ++buf;
            }
            else if (tcp < 0xF0)
            {
                size = 2;
                buf += 2;
            }
            else
            {
                size = 3;
                buf += 3;
            }

            if (len >= size)
                len -= size;
            else
                break;
        }

        return count;
    }

计算utf8的文字个数

// return the number of utf8 code units required to encode the given utf32 code point
    size_type encoded_size(utf32 code_point) const
    {
        if (code_point < 0x80)
            return 1;
        else if (code_point < 0x0800)
            return 2;
        else if (code_point < 0x10000)
            return 3;
        else
            return 4;
    }

计算ucs4的  转到utf8 的字节个数

size_type encode(const utf8* src, utf32* dest, size_type dest_len, size_type src_len = 0) const
    {
        // count length for null terminated source...
        if (src_len == 0)
        {
            src_len = utf_length(src);
        }

        size_type destCapacity = dest_len;

        // while there is data in the source buffer, and space in the dest buffer
        for (uint idx = 0; ((idx < src_len) && (destCapacity > 0));)
        {
            utf32    cp;
            utf8    cu = src[idx++];

            if (cu < 0x80)
            {
                cp = (utf32)(cu);
            }
            else if (cu < 0xE0)
            {
                cp = ((cu & 0x1F) << 6);
                cp |= (src[idx++] & 0x3F);
            }
            else if (cu < 0xF0)
            {
                cp = ((cu & 0x0F) << 12);
                cp |= ((src[idx++] & 0x3F) << 6);
                cp |= (src[idx++] & 0x3F);
            }
            else
            {
                cp = ((cu & 0x07) << 18);
                cp |= ((src[idx++] & 0x3F) << 12);
                cp |= ((src[idx++] & 0x3F) << 6);
                cp |= (src[idx++] & 0x3F);
            }

            *dest++ = cp;
            --destCapacity;
        }

        return dest_len - destCapacity;
    }

从utf8 转到utf32  即ucs4

size_type encode(const utf32* src, utf8* dest, size_type dest_len, size_type src_len = 0) const
    {
        // count length for null terminated source...
        if (src_len == 0)
        {
            src_len = utf_length(src);
        }

        size_type destCapacity = dest_len;

        // while there is data in the source buffer,
        for (uint idx = 0; idx < src_len; ++idx)
        {
            utf32    cp = src[idx];

            // check there is enough destination buffer to receive this encoded unit (exit loop & return if not)
            if (destCapacity < encoded_size(cp))
            {
                break;
            }

            if (cp < 0x80)
            {
                *dest++ = (utf8)cp;
                --destCapacity;
            }
            else if (cp < 0x0800)
            {
                *dest++ = (utf8)((cp >> 6) | 0xC0);
                *dest++ = (utf8)((cp & 0x3F) | 0x80);
                destCapacity -= 2;
            }
            else if (cp < 0x10000)
            {
                *dest++ = (utf8)((cp >> 12) | 0xE0);
                *dest++ = (utf8)(((cp >> 6) & 0x3F) | 0x80);
                *dest++ = (utf8)((cp & 0x3F) | 0x80);
                destCapacity -= 3;
            }
            else
            {
                *dest++ = (utf8)((cp >> 18) | 0xF0);
                *dest++ = (utf8)(((cp >> 12) & 0x3F) | 0x80);
                *dest++ = (utf8)(((cp >> 6) & 0x3F) | 0x80);
                *dest++ = (utf8)((cp & 0x3F) | 0x80);
                destCapacity -= 4;
            }

        }

        return dest_len - destCapacity;
    }

从utf32 转utf8

时间: 2024-10-11 13:25:42

utf8 ucs4的相关文章

PHP Unicode编码相互转换

<?php /** * $str 原始中文字符串 * $encoding 原始字符串的编码,默认utf-8 * $prefix 编码后的前缀,默认"&#" * $postfix 编码后的后缀,默认";" */ function unicode_encode($str, $encoding = 'utf-8', $prefix = '&#', $postfix = ';') {     //将字符串拆分     $str = iconv(&quo

php中文和unicode互转

unicode转中文时可以使用json_decode()函数实现. 中文转unicode时需要对字符串转换成UCS-4编码,再转成16进制,再从16进制转换成10进制加上&#前缀来实现中文转unicode编码. 一.unicode转中文 php <?php //unicode转中文 function unicodeDecode($unicode_str){ $json = '{"str":"'.$unicode_str.'"}'; $arr = jso

C++11之后,对源代码增加了UTF8和UCS4的支持(Windows内部使用Unicode,因为nt内核用的是ucs2,那是89年,utf8到了92年才发明出来)

在C++编程中, 我们常打交道的无非是编辑器和编译器, 对编辑器起来说,我们常遇到就是乱码问题, 比如中文注释显示或是保存不了等, 解决办法就是把你的文件保存成Unicode(UTF8). 对于编译器来说, 编码方式取决于它对C++标准的支持程度, 比如C++ 11以前,字符串我们只能指定成2种:一种是MBCS,如char* p="abc哈哈": 还有一种是UCS2, 比如wchar_t*p = L"abc哈哈", 这样编译器就知道你要表示的字符串类型.C++11之

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言字符编码值相同却代表不同的符号(例如:韩文编码EUC-KR中“???”的编码值正好是汉字编码GBK中的“茄惫绢”).因此,同一份文档,拷贝至不同语言的机器,就可能成了乱码,于是人们就想:我们能不能定义一个超大的字符集,它可以容纳全世界所有的文字字符,再对它们统一进行编码,让每一个字符都对应一个不同的编码值,从而就不会再有乱码了. 如果说“各个国家都在为自己文字独立编码”是百家争鸣,那么“建立世

字符编解码的故事(ASCII,ANSI,Unicode,Utf-8区别)

好文分享UTF-8, 字符集, 编解码 (关于字符编码的深入解释,请参见我的原创文章<关于字符编码,你所需要知道的>.) 此文为转载,有少许修订,原文出处不详. 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们认为8个开关状态作为原子单位很好,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出更多的状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"

字符编码笔记:ASCII,Unicode和UTF-8

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节". 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约

BOM的来源是不可能出现的字符,GB2312双字节高位都是1,Unicode理论的根本缺陷导致UTF8的诞生

Unicode字符编码规范 http://www.aoxiang.org 2006-4-2 10:48:02Unicode是一种字符编码规范 . 先从ASCII说起.ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits) 因此,ASCII编码可以表示的最大字符数是256,其实英文字符并没有那么多,一般只用前128个(最高位为0),其中包括了控制字符.数字.大小写字母和其他一些符号 . 而最高位为1的另128个字符被成为“扩展ASCII”,一般用来存放英文的制表符

UCS UTF UTF-7 UTF-8 UTF-16

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案.Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS.UCS可以看作是"Unicode Character Set"的缩写.UCS规定了怎么用多个字节表示各种文字. UCS有两种格式:UCS-2和UCS-4. 顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,

【转】【编码】ANSI,ASCII,Unicode,UTF8

不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码:在繁体中文Windows操作系统中,ANSI编码代表Big5:在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码.不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,