OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5715|回复: 1

关于原子哥的【ALIENTEK 战舰STM32开发板例程系列连载+教学】第四十六章 汉字显示实验中在linux中eclipse的移植问题小修改

[复制链接]

2

主题

4

帖子

0

精华

新手入门

积分
32
金钱
32
注册时间
2013-4-9
在线时间
0 小时
发表于 2013-4-9 22:33:53 | 显示全部楼层 |阅读模式
首先感谢原子哥,因为他让我更快更好地完成了课设。
进入正题:
    原子哥应该是在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;                                    //下一个汉字偏移
        }
    }
}
以上就是今晚对原子哥代码的一点点小小的改动,花费了大家的时间来看我这个不成熟的想法,谢谢各位

若非孤在此,不知几人称王,几人称帝!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-9 23:12:45 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 16:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表