一、
我用了正点原子的字库生成工具,生成了12、16、24号字体大小的GBK编码字库,汉字在liunx下存储方式默认为UTF-8内码形式,所以需要将UTF-8内码转换为GBK内码,UTF-8内码占3个字节,GBK内码占2个字节。
int opt_lcd::disp_str(int x, int y, char *str,unsigned char size,bool inv)
{
unsigned char bHz = 0;
char tmp_buf[100];//用来存放转换后的GBK码
int j,m;
char *data_buf = (char *)malloc(100);//data_buf存放转换前的UTF-8内码
while( *str !='\0')
{
data_buf[m++] = *str++;
}
Get_GBK_Code((unsigned char *)data_buf, (unsigned char *)tmp_buf); //转换编码格式
while (tmp_buf[j] !='\0')
{
if(!bHz)
{
if(tmp_buf[j] > 0x80)
bHz = 1;
else
{
if(x > (128-size/2))
{
x = 0;
y+=2;
}
if(y > 7)
{
break;
}
if(tmp_buf[j]==13)
{
x = 0;
y+=2;
}
else
disp_char(x,y,tmp_buf[j],size,inv);//显示英文
j++;
x+=size/2;
}
}
else
{
bHz = 0;
if(x > (128-size))
{
x = 0;
if((size ==12)||(size == 16))
y+=2;
if(size == 24)
y+=3;
}
if(y > 7)
break;
Show_Font(x,y,&tmp_buf[j],size,inv);//显示汉字
x += size;
j+=2;
}
}
free(data_buf);
return 0;
}
转换具体实现函数如下:
int opt_lcd::Get_GBK_Code(unsigned char *one_chinese_buf,unsigned char *tmp_buf)
{
unsigned char *output = tmp_buf;
UTF8_to_GBK(one_chinese_buf, strlen((const char *)one_chinese_buf), output, 100);
return 0;
}
int opt_lcd::UTF8_to_GBK(unsigned char *input_buf, size_t input_len, unsigned char *output_buf, size_t output_len)
{
const char *encTo = "GBK";
const char *encFrom = "UTF-8";
char *srcstart = (char *)input_buf;
char *tempoutbuf = (char *)output_buf;
int i = 0;
long ret = 0;
iconv_t fd = iconv_open(encTo, encFrom);
if (fd == (iconv_t)-1)
{
printf ("iconv_open fail \n");
return -1;
}
memset(output_buf, 0, output_len);
ret = iconv (fd, &srcstart, &input_len, &tempoutbuf, &output_len);
if (ret == -1)
{
printf ("iconv fail \n");
}
iconv_close (fd);
return 0;
}
二、
如果出现代码运行出现“iconv fail”的错误,就是需要更新libiconv库,到iconv官网下载最新的库源码包,下载地址为:
http://www.doczj.com/doc/c89b690976eeaeaad0f33045.html /gnu/libiconv/libiconv-1.14.tar.gz
解压后得到libiconv目录,在libiconv目录下:
$./configure --prefix=$PWD/out --host=arm-linux
$make
$make install
上述命令执行完成后会在libiconv目录下生成新的out目录,该目录下存在4个目录分别是:
bin include lib share
在lib目录下为生成的库文件,其中一个为preloadable_libiconv.so,把它下载到开发板
的lib目录下,然后再设置开发板的系统环境变量:执行下面语句
$ export LD_PRELOAD=/lib/preloadable_libiconv.so
三、实验结果