免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: ricky_pc
打印 上一主题 下一主题

[应用] 开发板中文显示问题 [复制链接]

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
11 [报告]
发表于 2010-06-23 20:20 |只看该作者
呵呵
你这样吧
所有的字体都用gbk的
然后setlocale函数,设置成gbk的
然后用自己的点阵字库,hzk16或者hzk24
试试,看看能不能显示出汉字
画点阵字的在本版精华里能找到
我手头现在没有开发板,我记得做汉字支持没这么困难

论坛徽章:
0
12 [报告]
发表于 2010-06-24 23:00 |只看该作者
本帖最后由 ricky_pc 于 2010-06-24 23:16 编辑
呵呵
你这样吧
所有的字体都用gbk的
然后setlocale函数,设置成gbk的
然后用自己的点阵字库,hzk16或者 ...
T-Bagwell 发表于 2010-06-23 20:20



    首先谢谢各位的热情回贴,十分感谢!

   把思绪理理,把我遇到的情况再详细说说:

       宿主机环境:vmware6.5(fedora 9中文)
          开发板:i.mx35(系统2.6.2


          宿主机上:locale命令:显示全是zh_CN.UTF-8,中文显示正常。
                         我曾试过改成zh_CN.GB2312,乱码,显示如下


         开发板上:在编译内核时,已选中支持cp936。在交叉编译好glibc后,移植到板子上文件包括:/usr/share/i18n,/usr/share/locale,/usr/bin/local,/usr/bin/localdef(如果漏了,请各位指明一下,谢谢)
                1、在插入U 盘时,用命令:mount -t vfat -o iocharset=cp936 /dev/sda1 /mnt/usb。可以看到U盘中中文文件名显示正确。
                2、曾在宿主机写了一简单程序,内容很简单:printf("测试\n"。通过交叉编译器编译后,在开发板上运行,打印出来的也是乱码。

我也曾尝试修改成zh_CN.UTF-8和zh_CN.GB2312,结果如图:

个人发现有两个异常:
1、在我用localedef命令时,必须加上参数--no-archive,否则报错:cannot map archive header:invalid argument
2、为什么中文能显示出一半?这是否与表示一个汉字所采取的字节数有关呢,如GB2312是两个字节表示,UTF-8用两个字节表示常用汉字,用三个字节表示不常用字符。

还有个问题:想弱弱问一句,除了字符集外,还有没有字体的说法在Linux表示中文的时候?

希望各位老大能帮帮忙
谢谢

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
13 [报告]
发表于 2010-06-26 11:27 |只看该作者
本帖最后由 T-Bagwell 于 2010-06-26 11:28 编辑

vfat是cp936
ntfs是utf-8

Linux下面是UTF-8编码
Windows下面是GB2312/GBK编码

如果Linux的字体想在Windows下显示出来,首先要把Linux里的字体转成GB2312/GBK编码,或者把Windows下面显示汉字的编码集转成UTF-8


如果想在Linux下面看到GB2312/GBK的编码,需要export LC_ALL=zh_CN.GB2312,或者GBK都可以,这个时候会显示出汉字

调试的时候看汉字就是这么个原理

我以为楼主想让开发板支持汉字显示在LCD上呢
其实支持不支持用一下自己的字库,或者直接把编码打印出来,看一下就知道是不是已经转成了UTF-8或者GBK的字符集了

论坛徽章:
0
14 [报告]
发表于 2010-06-26 15:52 |只看该作者
vfat是cp936
ntfs是utf-8

Linux下面是UTF-8编码
Windows下面是GB2312/GBK编码

如果Linux的字体想在Windows下显示出来,首先要把Linux里的字体转成GB2312/GBK编码,或者把Windows下面显示汉字的编码集转成UTF-8


如果想在Linux下面看到GB2312/GBK的编码,需要export LC_ALL=zh_CN.GB2312,或者GBK都可以,这个时候会显示出汉字

调试的时候看汉字就是这么个原理
T-Bagwell 发表于 2010-06-26 11:27

原来是这样呀。那么我的宿主机和开发板都是Linux系统,那么照理说在宿主机上写的程序(含中文),交叉编译后在开发板上显示,应该就不存在一个编译转换的问题罗?



我以为楼主想让开发板支持汉字显示在LCD上呢
其实支持不支持用一下自己的字库,或者直接把编码打印出来,看一下就知道是不是已经转成了UTF-8或者GBK的字符集了T-Bagwell 发表于 2010-06-26 11:27


看来我的描述还不到位呀,把老大给迷糊了。我确实是想让开发板支持汉字显示在LCD上。不过我同事说:你用printf打印汉字在终端上都显示乱码,那就别提在LCD上啦。所以我现在是先在试验通过应用程序在超级终端(或minicom)上显示中文。



其实支持不支持用一下自己的字库,或者直接把编码打印出来,看一下就知道是不是已经转成了UTF-8或者GBK的字符集了T-Bagwell 发表于 2010-06-26 11:27

“自己的字库”:是指我编译出来的字库?
“直接把编码打印出来”:这个不是太理解老大的意思。如果已经转成了UTF-8,会显示成什么?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
15 [报告]
发表于 2010-06-27 10:54 |只看该作者
原来是这样呀。那么我的宿主机和开发板都是Linux系统,那么照理说在宿主机上写的程序(含中文),交叉编译 ...
ricky_pc 发表于 2010-06-26 15:52



    http://linux.chinaunix.net/bbs/v ... p%3Bfilter%3Ddigest
看看这个吧,希望对你有帮助

你需要打印的是编码,而不是printf一个所谓的汉字

字体显示是这样的

首先读取你的汉字的编码,比如0A0A,然后去字库里面差周0A0A,如果在字库里有这个字,就能显示出来的,如果没有就显示不出来或者其他的乱七八糟的东西

至于你想在LCD上显示出来的是什么编码的字符(UTF-8还是GBK),这完全取决你的字库需要的是UTF-8的编码还是GBK的编码,他要GBK的编码,你得到的是UTF-8的编码,你只要将UTF-8转成GBK就可以了,无需考虑其他

论坛徽章:
0
16 [报告]
发表于 2010-06-28 11:14 |只看该作者
本帖最后由 ricky_pc 于 2010-06-28 11:28 编辑

终于稍微有了点进展。


test.txt是在宿主机(fedora 9中文版)下写的一个中文文件,test1.txt是利用命令iconv转化成gb2312后的文件。

超级终端:test.txt:乱码,test1.txt显示正常。这就证明window下用的是gb2312编码(而超级终端是在window这个大环境下的,受其影响)
minicom:test.txt:中文显示一半,另一半是方块,test1.txt乱码。

恰好在今天看到一个blog中提到字体问题。我猜测是不是中文字体问题影响到显示(中文系统下我新装了中楷字体)。于是在另一个虚拟机下(fedora 9en)开启minicom,显示中文文件如图:

较在中文系统下显示明显多了。

这只是我认为这个问题存在的原因,如有错误,还请各位指出来。

文中提到的那篇博文地址:http://blog.csdn.net/mociml/archive/2010/04/26/5531643.aspx 虽然说的是QT中文乱码,但个觉得还是有一点借鉴意义。

论坛徽章:
0
17 [报告]
发表于 2010-06-28 11:26 |只看该作者
另外一个问题:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <iconv.h>
  4. #define OUTLEN 255

  5. int main(void)
  6. {
  7.         char *in_utf8 = "娴嬭瘯绋嬪簭";
  8.         char out[OUTLEN];
  9.         char out1[OUTLEN];

  10.         u2g(in_utf8, strlen(in_utf8), out, OUTLEN);
  11.         g2u(out, strlen(out), out1, OUTLEN);
  12.        
  13.         printf("utf8-->gb2312: %s\n", out);
  14.         printf("gb2312-->utf8: %s\n", out1);

  15.         return 0;
  16. }

  17. int code_convert(char *from_charset, char *to_charset, char *in_buf, int in_len, char *out_buf, int out_len)
  18. {
  19.         iconv_t tl;

  20.         tl = iconv_open(to_charset, from_charset);
  21.         if(tl == 0)
  22.         {
  23.                 return -1;
  24.         }
  25.         memset(out_buf, 0, out_len);
  26.         if(iconv(tl, &in_buf, &in_len, &out_buf, &out_len) < 0)
  27.         {
  28.                 return -1;
  29.         }
  30.         iconv_close(tl);
  31.         return 0;
  32. }

  33. int u2g(char *in_buf, int in_len, char *out_buf, int out_len)
  34. {
  35.         return code_convert("UTF-8", "GB2312", in_buf, in_len, out_buf, out_len);
  36. }

  37. int g2u(char *in_buf, int in_len, char *out_buf, int out_len)
  38. {
  39.         return code_convert("GB2312", "UTF-8", in_buf, in_len, out_buf, out_len);
  40. }
复制代码
由于程序是在Linux下写的。而我打开是在window下,所以其中中文会变成乱码。
当我在宿主机上利用GCC编译好后,运行这段代码,没有任何问题。

但当我在开发板(minicom)中运行时,却无显示:


这个是为什么呢?会不会与缓冲方式有关?

论坛徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵节徽章
日期:2015-03-06 15:50:392015亚冠之大阪钢巴
日期:2015-06-12 16:01:352015年中国系统架构师大会
日期:2015-06-29 16:11:2815-16赛季CBA联赛之四川
日期:2018-12-17 14:10:21
18 [报告]
发表于 2010-06-28 21:32 |只看该作者
打印编码值,不要打印%s,打印%x
我相信,你看%x比看%s更能说明问题

论坛徽章:
0
19 [报告]
发表于 2010-06-30 11:58 |只看该作者
│ CONFIG_NLS:                                                                                                                        │  
  │                                                                                                                                    │  
  │ The base Native Language Support. A number of filesystems                                                                          │  
  │ depend on it (e.g. FAT, JOLIET, NT, BEOS filesystems), as well                                                                     │  
  │ as the ability of some filesystems to use native languages                                                                         │  
  │ (NCP, SMB).                                                                                                                        │  
  │                                                                                                                                    │  
  │ If unsure, say Y.                                                                                                                  │  
  │                                                                                                                                    │  
  │ To compile this code as a module, choose M here: the module                                                                        │  
  │ will be called nls_base.                                                                                                           │  
  │                                                                                                                                    │  
  │ Symbol: NLS [=y]                                                                                                                   │  
  │ Prompt: Native language support                                                                                                    │  
  │   Defined at fs/nls/Kconfig:5                                                                                                      │  
  │   Location:                                                                                                                        │  
  │     -> File systems  
   

建议你看看 内核中文件系统 里的 字符编码 打开了没有。 这个也很重要。

常用配置:
CONFIG_NLS=y
CONFIG_NLS_DEFAULT="iso8859-1"
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_936=y
CONFIG_NLS_CODEPAGE_950=y
CONFIG_NLS_CODEPAGE_932=y
CONFIG_NLS_CODEPAGE_949=y
CONFIG_NLS_CODEPAGE_1251=y
CONFIG_NLS_ASCII=y
CONFIG_NLS_ISO8859_1=y
CONFIG_NLS_ISO8859_2=y
CONFIG_NLS_UTF8=y
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP