新手入门
- 积分
- 32
- 金钱
- 32
- 注册时间
- 2013-4-9
- 在线时间
- 0 小时
|
首先感谢原子哥,因为他让我更快更好地完成了课设。
进入正题:
原子哥应该是在windows操作系统下完成的工作,所以可能对linux中的移植性可能没有想到。但今天下午我在翻译原子哥的代码的时候(就是将STM32程序转到我自己的板子上),在Ubuntu12.10中,遇到了问题。这是我使用的函数Show_Str(0,0,120,20,"啊",12,0);该函数在text.c中。这是函数的原型void Show_Str(unsigned short int x,unsigned short int y,unsigned short int width,unsigned short int height,unsigned char*str,unsigned char size,unsigned char mode);通过调试,我发现str的值是0xe5958a00而不是GBK编码方式下的0xb0a1,后来通过各种猜想和查询以及验证,发现是操作系统的编码方式不一样导致的。因为在windows下默认编码方式为GBK,在Ubuntu下为UTF-8。在Ubuntu编辑器下,它的中文为UTF-8编码方式。以下是我所能想到的两种解决方式:
1、将eclipse的编码方式改为GBK,这种方法简单易行。操作方法见
http://blog.sina.com.cn/s/blog_702c2db50100w5w9.html
但是这个方法最大的坏处在于,之前所有的程序中的中文部分都将因为编码方式的改变成为乱码,当然,转码文件的方法这一部分就请自行解决。这样做一个潜在的优势就是从此你的windows下和linux下的eclipse编译的文件就不用再重复转码了。
2、通过一个函数将UTF-8转成GBK,再执行汉字显示。我选择的是这个方法,具体的函数如下:
我添加了两个很小型的函数,因为课设在即,没有时间做一个完整的UTF-8转Unicode的函数,如果有想编写的人员
可以参考如下链接:
http://blog.csdn.net/nrc_douningbo/article/details/5880602
http://www.cnblogs.com/xdotnet/archive/2007/11/23/unicode_and_utf8.html
unsigned short int Hz_Utf82Unicode(const unsigned char *in)
{
unsigned short int Unicode;
if((*in) != 0){
Unicode = ((in[0] & 0x1F)<<12) + ((in[1] & 0x3F)<<6) + (in[2] & 0x3F);
}
return Unicode;
}
void Hz_Utf82GBK(unsigned char *out,const unsigned char *in)
{
unsigned short int GBK;
GBK = ff_convert(Hz_Utf82Unicode(in),0);
out[0] = GBK >> 8;
out[1] = GBK & 0xff;
}
然后我将Show_Str做了一点点小小地修改。
void Show_Str(unsigned short int x,unsigned short int y,unsigned short int width,unsigned short int height,unsigned char*str,unsigned char size,unsigned char mode)
{
unsigned short int x0=x;
unsigned short int y0=y;
unsigned char out[2]; //转码输出
...... //中间省略
else//中文
{
bHz=0;//有汉字库
if(x>(x0+width-size))//换行
{
y+=size;
x=x0;
}
if(y>(y0+height-size))break; //越界返回
Hz_Utf82GBK(out,str); //转码
Show_Font(x,y,out,size,mode); //显示这个汉字,空心显示
str+=3; //请注意,这里要加3而不是原来的加2,因为UTF-8的中文是3个字节
x+=size; //下一个汉字偏移
}
}
}
以上就是今晚对原子哥代码的一点点小小的改动,花费了大家的时间来看我这个不成熟的想法,谢谢各位
|
|