0
点赞
收藏
分享

微信扫一扫

linux系统下UTF-8转GBK编码,使用汉字字库在LCD显示汉字

小北的爹 2022-01-21 阅读 61

 一、

        我用了正点原子的字库生成工具,生成了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

 三、实验结果

 

 

举报

相关推荐

0 条评论