C++ 如何从c++;?

C++ 如何从c++;?,c++,utf-8,binary,C++,Utf 8,Binary,例如,我有:11100011 1000010 10100010。它是:ア; 它在UTF-8中的编号是:12450 如何从二进制中获取此数字?您显示的字节序列是字符的UTF-8编码版本 您需要解码UTF-8以获得Unicode代码点 对于这个精确的字节序列,以下位构成代码点: 11100011 10000010 10100010 **** ****** ****** 因此,将带星号的位串接在一起,我们得到了数字00110000101010,它等于十进制的0x30a2或12450

例如,我有:
11100011 1000010 10100010
。它是:
;
它在UTF-8中的编号是:
12450


如何从二进制中获取此数字?

您显示的字节序列是字符的UTF-8编码版本

您需要解码UTF-8以获得Unicode代码点

对于这个精确的字节序列,以下位构成代码点:

11100011 10000010 10100010
    ****   ******   ******
因此,将带星号的位串接在一起,我们得到了数字
00110000101010
,它等于十进制的0x30a2或12450

有关如何解释编码的详细信息,请参阅

简言之:如果在第一个字节中设置了位7,那么同样设置的相邻位(称为m)的数量(2)给出了该代码点后面的字节数。对于第一个字节,要从每个字节中提取的位数为(8-1-1-m),对于每个后续字节,要提取的位数为6位。这里我们得到了(8-1-1-2)=4+2*6=16位

正如在评论中指出的,有很多库可以实现这一点,因此您可能不需要自己实现它。

从开始,我提出了以下建议:

unsigned utf8_to_codepoint(const char* ptr) {
    if( *ptr < 0x80) return *ptr;
    if( *ptr < 0xC0) throw unicode_error("invalid utf8 lead byte");
    unsigned result=0;
    int shift=0;
    if( *ptr < 0xE0) {result=*ptr&0x1F; shift=1;}
    if( *ptr < 0xF0) {result=*ptr&0x0F; shift=2;}
    if( *ptr < 0xF8) {result=*ptr&0x07; shift=3;}
    for(; shift>0; --shift) {
        ++ptr;
        if (*ptr<0x7F || *ptr>=0xC0) 
            throw unicode_error("invalid utf8 continuation byte");
        result <<= 6;
        result |= *ptr&0x6F;
    }
    return result;
}
无符号utf8到码点(const char*ptr){
if(*ptr<0x80)返回*ptr;
如果(*ptr<0xC0)抛出unicode_错误(“无效的utf8前导字节”);
无符号结果=0;
int-shift=0;
如果(*ptr<0xE0){result=*ptr&0x1F;shift=1;}
如果(*ptr<0xF0){result=*ptr&0x0F;shift=2;}
如果(*ptr<0xF8){result=*ptr&0x07;shift=3;}
对于(;shift>0;--shift){
++ptr;
如果(*ptr=0xC0)
抛出unicode_错误(“无效的utf8连续字节”);

结果“它在UTF-8中的数字是”您的意思是,它是Unicode值()是的。这一点非常重要。如果你打算以任何方式操作unicode,那就为自己准备一个unicode库来完成这项工作。@MooingDuck:是的。虽然我同意,当你有了它的时候,自己实现它并没有什么好处。这是一种家庭作业,所以我必须“手动”完成;)