Open zhishu520 opened 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; }
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