研究Hprose的windows编译时,发现它使用了emoji编码。emoji需要utf-32的字符才能存下。(此句不准确,应该是至少4个字节才能存放)。所以有说法用mysql存emoji时,需要使用utf8-mb4。

比如:??

首先来个简单的测试程序:

g++-6 -std=c++11 encoding.cpp -o encoding

#include #include #include

using namespace std;

int main()

{

printf("sizeof(wchar_t)=%zu\n", sizeof(wchar_t));

printf("sizeof(char16_t)=%zu\n", sizeof(char16_t));

printf("sizeof(char32_t)=%zu\n", sizeof(char32_t));

const char native[] = "??";

printf("native:");

for (unsigned i = 0; i < strlen(native); i++)

{

printf("%02x ", (unsigned char)native[i]);

}

printf("\n");

wchar_t wchar[] = L"??";

printf("wchar:");

for (auto item : wchar)

{

printf("%x ", item);

}

printf("\n");

wstring wstr = L"??";

printf("wstr:");

for (auto item : wstr)

{

printf("%x ", item);

}

printf("\n");

u16string u16str = u"??";

printf("u16:");

for (auto item : u16str)

{

printf("%x ", item);

}

printf("\n");

u32string u32str = U"??";

printf("u32:");

for (auto item : u32str)

{

printf("%x ", item);

}

printf("\n");

return 0;

}

Linux上输出:

sizeof(wchar_t)=4

sizeof(char16_t)=2

sizeof(char32_t)=4

native:f0 9f 87 a8 f0 9f 87 b3

wchar:1f1e8 1f1f3 0

wstr:1f1e8 1f1f3

u16:d83c dde8 d83c ddf3

u32:1f1e8 1f1f3

(1)其对应的utf32(u32string)为:1f1e8 1f1f3

(2)其对应的utf8(string)为:f0 9f 87 a8, f0 9f 87 b3

-> 11110[000] 10[0011111] 10[000111] 10[101000],即000001 11110001 11101000=0x1f1e8

和 11110[000] 10[0011111] 10[000111] 10[110011],即000001 11110001 11110011=0x1f1f3

和utf32匹配了。

(3)其对应的utf16(u16string)为:d83c dde8 d83c ddf3

-> 1101 10[00 0011 1100], 1101 11[01 1110 1000],即000[0+1] 11110001 11101000=0x1f1e8

和 1101 10[00 0011 1100], 1101 11[01 1111 0011],即000[0+1] 11110001 11110011=0x1f1f3

和utf32也是匹配的。注意计算中要加1。

(4)其对应的Windows的wstring是d83c dde8 d83c ddf3。

转码得到的是:ED A0 BC, ED B7 A8, ED A0 BC, ED B7 B3

ED A0 BC 1110 [1101] 10[10 0000] 10[11 1100] 即 1101 1000 0011 1100 -> D8 3C

ED B7 A8 1110 [1101] 10[11 0111] 10[10 1000] 即 1101 1101 1110 1000 -> DD E8

ED A0 BC 1110 [1101] 10[10 0000] 10[11 1100] 即 1101 1000 0011 1100 -> D8 3C

ED B7 B3 1110 [1101] 10[11 0111] 10[11 0011] 即 1101 1101 1111 0011 -> DD F3

参考

Facet 说明

std::codecvt_utf8 封装了UTF-8与UCS2及UTF-8与UCS4的编码转换

std::codecvt_utf16 封装了UTF-16与UCS2及UTF-16与UCS4的编码转换

std::codecvt_utf8_utf16 封装了UTF-8与UTF-16的编码转换

说明hprose使用

std::wstring_convert<:codecvt_utf8>> conv;

writeString(conv.to_bytes(str));

对于windows产生的是UCS2->UTF8,对于linux/mac产生的是UTF32->UTF8。

std::wstring_convert<:codecvt_utf8_utf16>, wchar_t> conv;

writeString(conv.to_bytes(str));

产生的是UTF16->UTF8。

emoji mysql 转 unicode_unicode和emoji编码相关推荐

  1. emoji mysql 配置_MySql支持Emoji表情

    1.原因: UTF-8编码有可能是两个.三个.四个字节.Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 2.解决方案: 将Mysql的编码从utf8转换成utf8 ...

  2. mysql图标_MySQL 支持 emoji 图标存储

    在MySLQ中 UPDATA 和 INSERT 数据的时候,如果数据上面带有emoji图标,例如:?.?.? 很容易更新或者插入不成功,导致报错. 都快崩溃了,但是还好终于解决了这种鬼问题.资料显示原 ...

  3. 综合网上解决mysql 5.7保存emoji 失败问题

    开发项目时遇到用mysql 5.7 保存emoji 失败,在百度上看了很多的解决办法,终于解决了,综合一下所有的解决办法. 1 将Mysql的编码从utf8转换成utf8mb4. 2 my.cnf 文 ...

  4. mysql存储图片node_Node.js教程 阿里云mysql如何支持存储emoji表情

    本篇教程介绍了Node.js教程 阿里云mysql如何支持存储emoji表情,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入. < 本篇主要记录nodejs项目阿里云m ...

  5. emoji mysql存储

    执行插入前执行:SET NAMES utf8mb4; 如: SET NAMES utf8mb4; INSERT test(Content) VALUES('-'); PHP例子: $paramValu ...

  6. mysql存json将utf8编码 去掉,MySQL对JSON类型UTF-8编码导致中文乱码探讨

    原文:https://www.cnblogs.com/CreateMyself/p/12587426.html 前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有 ...

  7. MySQL对JSON类型UTF-8编码导致中文乱码探讨

    继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现 ...

  8. php 微信emoji输出,页面如何输出Emoji表情字符

    Emoji表情符号广泛运用于各种的社交软件上,是非常受欢迎的一种字符,如果用语言文字无法表达你内心的冲动,发一个Emoji表情就好了. 对于web而言如何在页面保存和展现这些字符呢?这可不是件容易的事 ...

  9. oracle存储emoji表情,Android自带emoji表情的使用方法详解

    什么是emoji表情 emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码.更进一步说,emoji表情实际上是一组Unicod ...

最新文章

  1. 土壤生物多样性与生物化学过程研讨会(6.20-23合肥)
  2. 专访SIGDIAL2020最佳论文一作高信龙一:成功都是一步步走出来的
  3. 【内推】腾讯优图(深圳)实验室招计算机视觉算法实习生
  4. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
  5. 执行transact mysql_创建数据库失败((Microsoft.SqlServer.Smo))执行Transact-SQL
  6. Valgrind使用说明
  7. linux shell 等待输入_linux运维——基础篇
  8. GrideView属性的学习
  9. Sublime Text快捷键去除空白行
  10. 围棋提子后的子放哪_围棋入门知识点:围棋规则 —— 禁入点
  11. SVN客户端——SmartSVN功能详解
  12. mysql front的使用注意要点
  13. 鱼塘钓鱼(fishing)
  14. 万维钢:怎样做读书笔记
  15. 美团因拖欠骑手工资被约谈;传苹果6月6日举办全球开发者大会;Linux 5.18开始启动停止支持ReiserFS|极客头条
  16. 液晶显示器图像颜色发黄,菜单颜色正常
  17. JavaWeb网上订餐管理系统|餐饮就餐订餐餐厅(含源码+论文+答辩PPT等)
  18. GPS卫星同步时钟,GPS卫星时钟,GPS时钟
  19. 一只蝴蝶挥了挥翅膀,于是有了AI读心术
  20. UEFI安装win7过程的另类引导系统

热门文章

  1. 有了ROS这架车,SLAM之路不再遥远!
  2. RandomRooms:用于3D目标检测的无监督预训练方法(ICCV2021)
  3. 3D视觉工坊中秋国庆贺礼!
  4. java与fabric区块链--fabric-ca-server 注册---(3)
  5. CentOS7(64位)安装Jupyter Notebook
  6. Android Binder IPC机制
  7. yii2 导入开源php项目_终于来了,yii2和phpstorm的完美整合,支持到你不要不要的。...
  8. 广东海洋大学计算机科学与技术排名,最新排名!广东高校22个学科位居全球前50位...
  9. 静态配置_【实验】华为静态路由基础配置
  10. python异常处理语句编程题_一篇文章让你掌握Python异常处理所有知识点,记得收藏...