中文字符在MQL的处理
“我花了两天时间,解决了一个中文字符在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的处理相关推荐
- java处理中文字符_Java中文字符处理的四大迷题
虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...
- OpenCV支持中文字符输出实现
在 http://www.opencv.org.cn/forum.php?mod=viewthread&tid=2083&extra=&page=1 中,作者给出了原始的在Op ...
- 打印出所有的中文字符
2019独角兽企业重金招聘Python工程师标准>>> 尝试打出所有的中文字符,中文字符的16进制范围是[u4e00-u9fa5]. public static String toS ...
- mysql rpc_使用XML-RPC和MySQL处理中文字符
我有一个异步Web服务,移动应用的用户可以在他们的手机上发表评论,它使用JSON将帖子上传到API,服务器将帖子输入到数据库中,并将确认发送回设备.服务器使用XML-RPC传递消息,但与设备的所有通信 ...
- python django mysql写入中文乱码_解决django 向mysql中写入中文字符出错的问题
之前使用django+mysql建立的一个站点,发现向数据库中写入中文字符时总会报错,尝试了修改settings文件和更改数据表的字符集后仍不起作用.最后发现,在更改mysql的字符集后,需要重建数据 ...
- 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)
pinyin4j项目 官网地址 http://pinyin4j.sourceforge.net/ 我们先把资源下载下来,连同源码和jar包一起放入工程.如下图: 接下来在demo包下,我们写一个测试 ...
- php怎样弄成中文,php怎样替换中文字符
[摘要] PHP即"超文本预处理器",是一种通用开源脚本语言.PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言.PHP独特的语法混合了C.Java.Perl以及 ...
- 【Java基础】Java中的char是否可以存储一个中文字符之理解字符字节以及编码集
Java中的一个char采用的是Unicode编码集,占用两个字节,而一个中文字符也是两个字节,因此Java中的char是可以表示一个中文字符的. 但是在C/C++中由于采用的字符编码集是ASCII, ...
- java a标签正则_正则表达式:java中婚配HTML中a标签中的中文字符
正则表达式:java中匹配HTML中a标签中的中文字符 今天群里一位朋友问到了一个正则表达式的问题,有如下内容: 特432 453543 a1特123你好123吗? 特2 标签中的文字现在要匹配出内容 ...
最新文章
- 不信iphone5 只要GALAXY S II珠峰仍有信号
- 《SAP CRM管理与实施指南》一一2.3 小结
- 使用Navicat for Oracle新建用户无法登陆(用户名大小写问题)
- 第一章 基础设施,1.3 阿里视频云ApsaraVideo是怎样让4000万人同时狂欢的(作者:蔡华)...
- mysql 5.7.20 win64_Win10下MySQL5.7.20 Mysql(64位)解压版安装及bug修复
- 面试题(9)之 leetcode-189
- 深入浅出 妙用Javascript中apply、call、bind
- CSS3学习笔记--line-height:150%与line-height:1.5的真正区别
- 华东师范数学分析第4版笔记和课后答案
- 啦啦外卖独立版41.4最新外卖源码全开源带vue源码
- 西门子PLC,STEP7 v5.5安装以及仿真软件Plcsim v5.4 sp5安装
- java calendar星期几_正确获取星期几(Calendar.DAY_OF_WEEK)
- Nike Air Shake ndestrukt white red Performance Reviews
- Day11:麦卡锡91函数(McCarthy 91)
- 【H5钢琴示例代码】
- MFC添加勾选控件check box
- 计算机基本组成及功能
- golang学习之negroni对于第三方中间件的使用分析
- Windows压缩工具 “ Bandizip 与 7-zip ”
- 软件测试工程师简历项目经验怎么写(含真实简历)