unicode-utf8转换

news/2024/11/18 3:31:37/

代码

#ifndef UNICONVERT_H
#define UNICONVERT_H#include <string>using std::string;namespace unicodeCvt{typedef unsigned int uint;//0x80 -> 10xx xxxx     BF//0xC0 -> 110x xxxx		1F//0xE0 -> 1110 xxxx		0F//0xF0 -> 1111 0xxx		07void func(uint unic,int num,string &str) {for(int i= num;i>=0;i--)str.append(1, static_cast<char>((0x80) | (unic>>6*i) & 0xBF));}string utf8str{};//单字符的unicode值转utf8编码的字符串string &&unicode2Utf8(uint unic){utf8str.clear();if (unic < 0x80) {utf8str.append(1, static_cast<char>(unic));}else if (unic > 0x7F && unic < 0x0800) {utf8str.append(1, static_cast<char>(0xC0 | ((unic >> 6) & 0x1F)));func(unic, 0, utf8str);}else if (unic > 0x07FF && unic < 0x010000) {utf8str.append(1, static_cast<char>(0xE0 | ((unic >> 12) & 0x0F)));func(unic, 1, utf8str);}else if (unic > 0xFFFF && unic < 0x10FFFF) {utf8str.append(1, static_cast<char>(0xF0 | ((unic >> 18) & 0x07)));func(unic, 2, utf8str);}return std::move(utf8str);}//utf8编码的单字符转对应的unicode值。uint utf82Unicode(const string &str){int len = str.size();if (len > 4 || len <= 0)return 0;uint origin = 0;//翻转char arr[4]{};for (int i = 0; i < len; i++) {memcpy(arr+len-i-1, &str.at(i), 1);}memcpy(&origin, &arr, 4);uint unicode = 0;switch (len){case 1:return origin;case 2:{for (int i = 0; i < 6; i++)unicode |= (0x01 << i)&origin;for (int i = 8; i < 13; i++)unicode |= ((0x01 << i)&origin) >> 2;return unicode;}case 3:{for (int i = 0; i < 6; i++)unicode |= (0x01 << i)&origin;for (int i = 8; i < 14; i++)unicode |= ((0x01 << i)&origin) >> 2;for (int i = 16; i < 20; i++)unicode |= ((0x01 << i)&origin) >> 4;return unicode;}case 4:{for (int i = 0; i < 6; i++)unicode |= (0x01 << i)&origin;for (int i = 8; i < 14; i++)unicode |= ((0x01 << i)&origin) >> 2;for (int i = 16; i < 22; i++)unicode |= ((0x01 << i)&origin) >> 4;for (int i = 24; i < 27; i++)unicode |= ((0x01 << i)&origin) >> 6;return unicode;}default:return 0;}}};
#endif // UNICONVERT_H

调用如下:

#define UNIC2UTF8
void preformanceTest()
{
#ifdef ABC//右值能提升很多倍速度for (uint i = 0; i < 0x10FFFF; i++){string &&str = unicode2Utf8(i);}
#elsefor (uint i = 0; i < 0x10FFFF; i++){string &&str = unicode2Utf8(i);uint unic = utf82Unicode(str);}
#endif // UNIC2UTF8}

说明

  1. unicode2Utf8函数将unicode值转为对应的utf8编码的字符串

  2. utf82Unicode函数将utf8编码的字符串转为unicode值

  3. 两个函数性能都经过测试验证,目前是我能够优化的极限。

  4. 两者的转换原理则依据下表(详情参考字符编码):

Unicode码位范围

utf-8编码二进制

内存空间

0x00-0x7F

0xxxxxxx

一字节

0x80-0x07FF

110xxxxx 10xxxxxx

两字节

0x0800-0xFFFF

1110xxxx 10xxxxxx 10xxxxxx

三字节

0x010000-0x10FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

四字节


http://www.ppmy.cn/news/606083.html

相关文章

list extend 和 append

append 一次追加一个列表 extend 一次追加所有的元素 单个的形式加入

LeetCode简单题之按奇偶排序数组 II

题目 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述条件…

Python关于%matplotlib inline

我在做一个比赛需要使用到LSTM模型对时间序列进行预测&#xff0c;然后在github代码中经常会看到这样的代码&#xff1a; import numpy import matplotlib.pyplot as plt from pandas import read_csv import math from keras.models import Sequential from keras.layers impo…

LeetCode简单题之找到小镇的法官

题目 小镇里有 n 个人&#xff0c;按从 1 到 n 的顺序编号。传言称&#xff0c;这些人中有一个暗地里是小镇法官。 如果小镇法官真的存在&#xff0c;那么&#xff1a; 小镇法官不会信任任何人。 每个人&#xff08;除了小镇法官&#xff09;都信任这位小镇法官。 只有一个人同…

plt.figure()的使用

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 by-sa 版权协议&#xff0c;转载请附上原文出处链接和本声明。本文链接&#xff1a;https://blog.csdn.net/m0_37362454/article/details/815114271.figure语法及操作 (1)figure语法说明 figure(numNone, figsi…

LeetCode简单题之查找共用字符

题目 给你一个字符串数组 words &#xff0c;请你找出所有在 words 的每个字符串中都出现的共用字符&#xff08; 包括重复字符&#xff09;&#xff0c;并以数组形式返回。你可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;words [“bella”,“label”,“r…

Js进阶27-Promise专题

1. Promise 简介 Promise 是异步编程的一种解决方案&#xff0c;其实是一个构造函数&#xff0c;自己身上有 all、reject、resolve 这几个方法&#xff0c;原型上有 then、catch等方法。 Promise 对象有以下两个特点&#xff1a; (1) 对象的状态不受外界影响。Promise 对象代…

计算机视觉几个应用

计算机视觉几个应用 Nvidia炼丹神器 深度学习的训练比较玄学&#xff0c;大家经常调侃就像"炼丹"一样。如果有个好工具&#xff0c;科学"炼丹"的效率就会显著提升&#xff01; Amusi 这里给大家介绍的是 NVIDIA 官方推出的 TAO 工具套件&#xff0c;即一…