关于 unicode 的思考 , 及各个语言的表现

在编写某个小工具的时候(环境:win10 x64 + vc6.0 ANSI),偶然发现 post 返回的数据大部分都是 unicode 码 ,如 \u5555

于是千方百计的寻找资料找到了两个转码方案,终于把 unicode 成功转换到 中文 ,

但是不久发现部分 unicode 无法转换成功,返回显示的都是 '?', 两个方案都是一样的情况。 (环境:win10 x64 + vc6.0 ANSI)

尝试很久都无法成功转换,根据网络资料得知,转换失败的码值 在 国际音标扩展 的区间 ,即 0250-02AF , 还有 空白修饰字母 的区间 02B0-02FF
(有想过是否是系统字体的不支持的原因,但后来都否定了)
于是尝试别的语言,看看有何表现

1.python

首先尝试的是 python (2.7),因为听说python 有很多功能强大的库可以现成使用,而不必花费太多的心思造轮子

出于快速开发的考虑,界面ui选择 pyqt4, 因为使用 Designer 可以快速拖拽控件得到界面

结果:python 本身已经支持 unicode , 在 pycharm 的控制台可以得出预料中的结果(包括 国际音标扩展),

使用字符串查找该特殊音标也可以找到(占位位置有点搞不明白),转码过程很轻松(有点看不懂),

但是把结果通过pyqt4的消息框展示的时候出现缺陷,消息框的标题可以完美显示,但是消息框内的提示内容文本则无法显示 国际音标扩展 (猜测其它的特殊字符应该也无法显示)

鉴于pyqt网络上资料太少,学习成本高,再加上无法完美支持,所以放弃 python

 

2.c#

结果: 完美支持。鉴于在多线程下访问控件时的繁琐,需要委托,以及c#的异常机制需要无数 try catch 过于繁琐, 但是该语言在快速开发的表现不错,保留候选

 

3. 易语言

结果:跟 vc6.0 是一样的情况。 鉴于该语言是中文编程,无法英文显示代码,放弃。

 

4.vs c++

结果:完美支持,在 unicode 的环境下,甚至不需要转换,直接将字符串的字面值转到 16进制 数据保存即可,但是在试验过程中遇到一个诡异问题,

CString str;
str.GetBuffer(10);

str.GetBuffer(NULL)[0] = 0x0259; // 或者str.GetBuffer(NULL)[0] = L'ə';

str.ReleaseBuffer();

AfxMessageBox(str);

结果前面部分正常,但是后面带着一串乱码,并且随着 GetBuffer 获得的内存变长,后面带着的乱码也变长,疑似未初始化导致出现的野值,尝试使用 memset 发现

str.GetBuffer(1);memset(str.GetBuffer(NULL), 0, 1); // 正常

str.GetBuffer(2);memset(str.GetBuffer(NULL), 0, 2); // 后面带有乱码

str.GetBuffer(3);memset(str.GetBuffer(NULL), 0, 3); // 后面带有乱码

str.GetBuffer(4);memset(str.GetBuffer(NULL), 0, 4); // 正常 ( >= 4 都正常,2-3带乱码 )

结论:在一个 unicode 字符的情况下,无论是GetBuffer 还是 memset 不满足 >= 4 都会带有乱码;

除非 字符个数 与 内存参数 相同,

即 一个 unicode 字符,GetBuffer(1) memset(str.GetBuffer(NULL), 0, 1)  或者 两个 unicode 字符,GetBuffer(2) memset(str.GetBuffer(NULL), 0, 2) 以此类推,都不会有乱码,

如果放进去的数据大小比内存参数少,还是会出现后面跟着乱码,

比如 str.GetBuffer(2);memset(str.GetBuffer(NULL), 0, 2);str.GetBuffer(NULL)[0] = 0x0259;//str.GetBuffer(NULL)[1] = 0x0258;//没有这句就带乱码

使用 str.GetBuffer(NULL)[1] = 0; 在后面置0 则可以解决问题,无论是 在赋值 0x0259 前使用,还是在 赋值后使用置零,都能解决该问题。

如果设置 CString 的空间刚好,就不会带乱码,比如:str.GetBuffer(1);str.GetBuffer(NULL)[0] = 0x0259;

后面带着乱码的原因是什么,暂不得知,继续探索......

 

posted on 2017-02-17 11:13  伊扎洛  阅读(180)  评论(0)    收藏  举报

导航