c++原生的unicode支持

来源:互联网 发布:mac 管理员账户没有了 编辑:程序博客网 时间:2024/06/05 14:42

c++原生的unicode支持

记一次字体轮廓提取遇到的问题

  • 起因
  • 解决
  • 浅谈字符串周边

起因

在做一个激光打标系统,里面不可避免的要用到图形矢量化的问题,于是就是用freetype2 lib提取字体轮廓数学模型,基本步骤是:

Created with Raphaël 2.1.2开始获取字符对应的UNICODE编码值查找编码值对应字库的信息下一步处理

较为重要的一步就是找到字符对应的编码值,在开始的试验中,代码非常粗暴,比如:

int fontChar ='J';

这样的代码是木有运行错误的,但当我

int fontChar ='及';

就出事了,得到的返回值是一个210556。后续的工作也全部发生错误

解决

查阅了相关资料,得知unicode编码是一种双字节(16位)的编码,比如字符’A’对应的ascii码为65,将65转换为16进制的16位数,0x0041,所以我们需要一个恰好为16位的数据结构来存储unicode码,int没有确定的位长,而且由于编译器的优化,显然不能得到正确的编码值。
幸运的是,c++内建数据类型中包含 wchar_t用于专门定义unicode编码值

wchar_t fontChar = '及';qDebug() << fontChar <<"jjjjjjjjjjjjjjjjjjjjjjjjj";

输出是:
>

36746 jjjjjjjjjjjjjjjjjjjjjjjjj
我们这是看看’及’的unicode码是多少,随便百度一个unicode在线转换,结果是\u53ca,换算成十进制是21450(十进制),和我们的输出结果不一样!但是后续的步骤却又表明我们获得的这个fontChar的值能正常工作,我想这可能与qDebug()的实现有关。但这样让人看起来不舒服!

wchar_t fontChar = L'及';qDebug() << fontChar <<"jjjjjjjjjjjjjjjjjjjjjjjjj";

输出是:
>

21450 jjjjjjjjjjjjjjjjjjjjjjjjj
这下输出也正常了。

结论:当需要编码值时,请使用wchar_t fontChar =L’及’;

浅谈字符串周边

由于各种标准及各种编译器甚至不同的系统和语言设置均会对我们的字符(串)编码造成影响,使用内建数据类型和相关宏要比我们耍一些技巧更容易避免错误。

0 0