“我花了两天时间,解决了一个中文字符在MQL下的解码问题”

众所周知中文字符需要用UTF8编码。

如果是用高级语言开发,那么基本不会遇到编解码问题,语言本身就帮你处理了这些细节。

但如果你用C语言,而且不允许用第三方库呢?

UT8和中文编码

以前的计算机只支持英文字符的时候,全部字符加符号也不过一两百个,ascii解决不了的,扩展一下表就可以了。

后来遇到了中文等其他语言,ascii就没辙了。动不动几万个字符,这咋整?

于是就有了UTF8编码。

比如"帅小伙",用UTF8编码是

帅小伙

这是三个双字节的编码。

后台想把“帅小伙”通过json传给我,我在MQL里拿到的就是下面这串字符,

\u5E05\u5C0F\u4F19

这里面的\u表示转义字符是utf编码。

现在问题来了,只有基本的C语言类型和API,没有第三方库的情况下,怎么正确显示中文?

char转short,再位移一下

\u5E05 来说,

在MQL里,拿到是是一个 char[],

char[0] == '\';
char[1] == 'u';
char[2] == '5';
char[3] == 'E';
char[4] == '0';
char[5] == '5';

简化处理流程,我们把转义字符忽略掉,只考虑后面四个char。

于是我们的问题变成要解决

5E05 -> 帅

众所周知,UTF8编码是1-4字节长度,对于常见中文占两字节。所以我们需要一个short类型来存最终结果。

最后我们想要拿到的是一个short变量ch,

ushort ch = '帅';

从二进制角度把ch输出的话,会得到

0101 1110 0000 0101

刚好对应 5E05 !

于是问题就进一步简化了,我们只需要把 char[] 按位移,然后按半字节做或处理就行。

最后的障碍

实际上 char[] 的字符本身还是编码,比如 ‘5’,它是一个ascii编码,int值是53.

但这个问题不是很难,

只要把ascii编码按偏移量取值,就可以得到int值了。

因为’0’-‘9’,在ascii表里是连续的,从 48 到 57,只要把 char 减去48,就可以得到对应的int值。

到这里问题就解决了,

ushort ch = 0101 1110 0000 0101;

char[0] 是 ‘5’,转到ch的高位是 0101,取高位的代码

(char[0] << 12) & 0xF000

剩下的12bit按同样的方式取就行。

有什么用?

现在的高级语言基本都会帮开发者处理掉这些编码细节问题,开发中基本不需要手动去解决编码转换的操作。

这种虽然方便了开发者,但也导致了很多开发者到现在都不知道基本类型占几个字节。

有个故事讲的是一个流水线遇到机器运行问题,请了一个老工程师。

老工程师收了五万块,去到流水线,用粉笔在机器上画了一条线,说,把这里拆开,里面的线圈减掉5匝。

工人不服,划一条线为什么要给这么多。

老工程师讲,划一条线,值五毛钱,但知道在哪里划线,值5万块。

中文字符在MQL的处理相关推荐

  1. java处理中文字符_Java中文字符处理的四大迷题

    虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...

  2. OpenCV支持中文字符输出实现

    在 http://www.opencv.org.cn/forum.php?mod=viewthread&tid=2083&extra=&page=1 中,作者给出了原始的在Op ...

  3. 打印出所有的中文字符

    2019独角兽企业重金招聘Python工程师标准>>> 尝试打出所有的中文字符,中文字符的16进制范围是[u4e00-u9fa5]. public static String toS ...

  4. mysql rpc_使用XML-RPC和MySQL处理中文字符

    我有一个异步Web服务,移动应用的用户可以在他们的手机上发表评论,它使用JSON将帖子上传到API,服务器将帖子输入到数据库中,并将确认发送回设备.服务器使用XML-RPC传递消息,但与设备的所有通信 ...

  5. python django mysql写入中文乱码_解决django 向mysql中写入中文字符出错的问题

    之前使用django+mysql建立的一个站点,发现向数据库中写入中文字符时总会报错,尝试了修改settings文件和更改数据表的字符集后仍不起作用.最后发现,在更改mysql的字符集后,需要重建数据 ...

  6. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)

    pinyin4j项目  官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...

  7. php怎样弄成中文,php怎样替换中文字符

    [摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...

  8. 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集

    Java中的一个char采用的是Unicode编码集,占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的. 但是在C/C++中由于采用的字符编码集是ASCII, ...

  9. java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符

    正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...

最新文章

  1. 不信iphone5 只要GALAXY S II珠峰仍有信号
  2. 《SAP CRM管理与实施指南》一一2.3 小结
  3. 使用Navicat for Oracle新建用户无法登陆(用户名大小写问题)
  4. 第一章 基础设施,1.3 阿里视频云ApsaraVideo是怎样让4000万人同时狂欢的(作者:蔡华)...
  5. mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
  6. 面试题(9)之 leetcode-189
  7. 深入浅出 妙用Javascript中apply、call、bind
  8. CSS3学习笔记--line-height:150%与line-height:1.5的真正区别
  9. 华东师范数学分析第4版笔记和课后答案
  10. 啦啦外卖独立版41.4最新外卖源码全开源带vue源码
  11. 西门子PLC,STEP7 v5.5安装以及仿真软件Plcsim v5.4 sp5安装
  12. java calendar星期几_正确获取星期几(Calendar.DAY_OF_WEEK)
  13. Nike Air Shake ndestrukt white red Performance Reviews
  14. Day11:麦卡锡91函数(McCarthy 91)
  15. 【H5钢琴示例代码】
  16. MFC添加勾选控件check box
  17. 计算机基本组成及功能
  18. golang学习之negroni对于第三方中间件的使用分析
  19. Windows压缩工具 “ Bandizip 与 7-zip ”
  20. 软件测试工程师简历项目经验怎么写(含真实简历)

热门文章

  1. 视频头文件解析--ts
  2. SSRF漏洞JAVA解决方案
  3. 女人常干的十二件事。男人看完笑。女人看完脸红
  4. 事务-2 Spring与Mybatis事务实现原理
  5. 如何通俗地解释梯度下降法
  6. 从excel中读取数据,然后拟合幂律分布
  7. DIY 基于51单片机的电子温度计的总结
  8. 分析Redis Server went away产生的原因
  9. Teamcenter AWC安装问题记录
  10. 双色球彩票预测可视化(python)