这个问题不好回答,首先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 = ;
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 = ;
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 = ; while (len--)
{
tcp = *buf++;
++count;
size_type size = ; if (tcp < 0x80)
{
}
else if (tcp < 0xE0)
{
size = ;
++buf;
}
else if (tcp < 0xF0)
{
size = ;
buf += ;
}
else
{
size = ;
buf += ;
} 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 ;
else if (code_point < 0x0800)
return ;
else if (code_point < 0x10000)
return ;
else
return ;
}

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

size_type encode(const utf8* src, utf32* dest, size_type dest_len, size_type src_len = ) const
{
// count length for null terminated source...
if (src_len == )
{
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 = ; ((idx < src_len) && (destCapacity > ));)
{
utf32 cp;
utf8 cu = src[idx++]; if (cu < 0x80)
{
cp = (utf32)(cu);
}
else if (cu < 0xE0)
{
cp = ((cu & 0x1F) << );
cp |= (src[idx++] & 0x3F);
}
else if (cu < 0xF0)
{
cp = ((cu & 0x0F) << );
cp |= ((src[idx++] & 0x3F) << );
cp |= (src[idx++] & 0x3F);
}
else
{
cp = ((cu & 0x07) << );
cp |= ((src[idx++] & 0x3F) << );
cp |= ((src[idx++] & 0x3F) << );
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 = ) const
{
// count length for null terminated source...
if (src_len == )
{
src_len = utf_length(src);
} size_type destCapacity = dest_len; // while there is data in the source buffer,
for (uint idx = ; 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 >> ) | 0xC0);
*dest++ = (utf8)((cp & 0x3F) | 0x80);
destCapacity -= ;
}
else if (cp < 0x10000)
{
*dest++ = (utf8)((cp >> ) | 0xE0);
*dest++ = (utf8)(((cp >> ) & 0x3F) | 0x80);
*dest++ = (utf8)((cp & 0x3F) | 0x80);
destCapacity -= ;
}
else
{
*dest++ = (utf8)((cp >> ) | 0xF0);
*dest++ = (utf8)(((cp >> ) & 0x3F) | 0x80);
*dest++ = (utf8)(((cp >> ) & 0x3F) | 0x80);
*dest++ = (utf8)((cp & 0x3F) | 0x80);
destCapacity -= ;
} } return dest_len - destCapacity;
}

从utf32 转utf8

utf8 ucs4的更多相关文章

  1. 跨平台字符编码转换GBK、UTF8

    #if (defined _WIN32 || defined _WIN64) # include <windows.h> # include <stdio.h> # inclu ...

  2. std::u32string conversion to/from std::string and std::u16string

    I need to convert between UTF-8, UTF-16 and UTF-32 for different API's/modules and since I know have ...

  3. php &#编码/php unicode转码/php &#数字编码

    今天使PHP开发用到了Unicode的编码与解码,将unicode转为中文,再将中文转Unicode这样的操作是非常常见的,所以小编将这两个unicode中文互转函数给作为一个笔记保存起来,非常的简单 ...

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

    1. Unicode与ISO 10646 全世界很多个国家都在为自己的文字编码,并且互不想通,不同的语言字符编码值相同却代表不同的符号(例如:韩文编码EUC-KR中“한국어”的编码值正好是汉字编码GB ...

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

    在C++编程中, 我们常打交道的无非是编辑器和编译器, 对编辑器起来说,我们常遇到就是乱码问题, 比如中文注释显示或是保存不了等, 解决办法就是把你的文件保存成Unicode(UTF8). 对于编译器 ...

  6. C++11与Unicode及使用标准库进行UTF-8、UTF-16、UCS2、UCS4/UTF-32编码转换

    zt https://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/ Unicode Unicode是计算机领域的一项 ...

  7. [转]utf8编码原理详解

    from : http://blog.csdn.net/baixiaoshi/article/details/40786503 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态 ...

  8. unicode 和 utf8

    关于 unicode utf8 文章来自于 http://blog.csdn.net/tge7618291/article/details/7599902 ascii 主要来表示英文.但是要全世界那么 ...

  9. 趣谈unicode,ansi,utf-8,unicode big endian这些编码有什么区别(转载)

    从头讲讲编码的故事.那么就让我们找个草堆坐下,先抽口烟,看看夜晚天空上的银河,然后想一想要从哪里开始讲起.嗯,也许这样开始比较好…… 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同 ...

随机推荐

  1. NSLOOKUP命令的使用方法

    查询IP地址 nslookup最简单的用法是查询域名对应的IP地址,包括A记录.MX记录.NS记录CNAME记录. 查询A记录:nslookup 域名 查询MX记录:nslookup -q=mx 域名 ...

  2. WIN锁屏+鼠标移动事件

    winexec('rundll32.exe user32.dll, LockWorkStation', sw_hide); 1.shutdown.bat(关机)  rundll32.Exe shell ...

  3. 6. 支持向量机(SVM)核函数

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  4. Eigen教程(1)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 简介 Eigen是C++中可以用来调用并进行矩阵计算的一个库,简单了说它就是一个c+ ...

  5. 基于jquery横向手风琴效果

    基于jquery横向手风琴效果是一款基于jquery实现的左右滑动手风琴图片轮播切换特效.效果图如下: 在线预览   源码下载 效果图如下: <div class="flash&quo ...

  6. asp.net基于StateServer的二级域名共享session

    备注:亲自试验有效,如果网友有通过下面的教程未实现session共享的,欢迎留言说明你遇到的问题.必有回复. 最近为实现的二级域名共享session纠结好久.网上的很多实现的方法试了都不行,查了很久才 ...

  7. [转]操作MySQL数据库报出:Parameter index out of range (1 > number of parameters, which is

    原文地址:https://blog.csdn.net/zdx_y/article/details/52072914 对MySQL进行insert操作,控制台抛出以下错误:Parameter index ...

  8. 【UE4】VR模式下全屏(去掉两侧的黑边)

    1.下载UE4源码,用Visual Studio打开源码找到指定文件,修改代码后重新编译得到一个新的UE4编辑器 2.将游戏项目在新的UE4中打开,重新编译. 参考: https://caedmom. ...

  9. 【Unity】自定义编辑器窗口——拓展编辑器功能

    最近学习了Unity自定义编辑器窗口,下面简单总结,方便用到时回顾. 新建一个脚本: using UnityEngine; using System.Collections; using UnityE ...

  10. u-boot2011.09 启动流程记录

    start arch/arm/cpu/armv7/start.S 36 .globl _start 37 _start: b reset 136 reset: 137 bl save_boot_par ...