zhishu520 / blog

一个关于游戏开发的博客(*^__^*)
3 stars 0 forks source link

string 切割UTF-8汉字 #9

Open zhishu520 opened 5 years ago

zhishu520 commented 5 years ago

UTF-8的编码规则很简单,只有二条: 1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。 2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。 如表: 1字节 0xxxxxxx 2字节 110xxxxx 10xxxxxx 3字节 1110xxxx 10xxxxxx 10xxxxxx 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

#include <iostream>
#include <string>
#include <vector>

using namespace std;

static vector<string> getStringList(string str)
{
    vector<string> ret;

    int magics[] = {0x80, 0xF8, 0xF0, 0xE0, 0xC0};
    int size[] =   {   1,    5,    4,    3,    2};
    size_t len = str.size();

    for (int i = 0; i < len;)
    {
        for (int j = 0; j < 5; j++)
        {
            if ((str[i] & magics[j]) == (bool)j * magics[j])
            {
                ret.push_back(str.substr(i, size[j]));
                i += size[j];
                break;
            }
        }
    }

    return ret;
}

int main(int argc, const char * argv[]) {
    auto list = getStringList("我是zhishu520");
    return 0;
}
zhishu520 commented 5 years ago

image