C++将UTF-8字符串迭代或拆分为符号数组?

top*_*dev 10 c++ arrays split utf-8

搜索与平台和第三方库无关的迭代UTF-8字符串或将其拆分为UTF-8符号数组的方式.

请发布一个代码段.

解决: C++迭代或将UTF-8字符串拆分为符号数组?

Mar*_*ins 27

如果我理解正确,听起来你想要找到每个UTF-8字符的开头.如果是这样,那么解析它们就相当简单(解释它们是另一回事).但是RFC的定义涉及多少八位字节的定义:

Char. number range  |        UTF-8 octet sequence
   (hexadecimal)    |              (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Run Code Online (Sandbox Code Playgroud)

例如,如果lb有UTF-8字符的第一个八位字节,我认为以下将确定所涉及的八位字节数.

unsigned char lb;

if (( lb & 0x80 ) == 0 )          // lead bit is zero, must be a single ascii
   printf( "1 octet\n" );
else if (( lb & 0xE0 ) == 0xC0 )  // 110x xxxx
   printf( "2 octets\n" );
else if (( lb & 0xF0 ) == 0xE0 ) // 1110 xxxx
   printf( "3 octets\n" );
else if (( lb & 0xF8 ) == 0xF0 ) // 1111 0xxx
   printf( "4 octets\n" );
else
   printf( "Unrecognized lead byte (%02x)\n", lb );
Run Code Online (Sandbox Code Playgroud)

但是,最终,如果在另一篇文章中建议你使用现有的库会好得多.上面的代码可能会根据八位字节对字符进行分类,但是一旦完成,它就无法对它们"做"任何事情.


top*_*dev 12

使用与平台无关的小型UTF8 CPP库解决:

    char* str = (char*)text.c_str();    // utf-8 string
    char* str_i = str;                  // string iterator
    char* end = str+strlen(str)+1;      // end iterator

    unsigned char[5] symbol = {0,0,0,0,0};

    do
    {
        uint32_t code = utf8::next(str_i, end); // get 32 bit code of a utf-8 symbol
        if (code == 0)
            continue;

        utf8::append(code, symbol); // initialize array `symbol`
    }
    while ( str_i < end );
Run Code Online (Sandbox Code Playgroud)