免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10377 | 回复: 3

大家说说Cygwin下UTF-8编码字符显示 [复制链接]

论坛徽章:
0
发表于 2010-01-20 15:14 |显示全部楼层
cygwin1.dll版本:1.7.1
bash版本:3.2.49(23)

[自己的程序无法显示UTF-8字符]

我用MinGW gcc 4.4.0编了个简单程序,printf char[]字符串到stdout,源代码用不带BOM的UTF-8保存,用WinHex查看编译后程序,里面的字符串也是UTF-8的,在cmd或Cygwin bash下运行,均按GBK解码字符,结果在ASCII之外的字符都是错误的。

[Cygwin中的程序能显示UTF-8字符]

但奇怪的是,我发现Cygwin自身的一些软件包都采用UTF-8的环境,比如:我的程序myapp.exe的UTF-8输出字符串本来是不能正确显示的,但如果将程序输出赋给环境变量:

VAR=`./myapp.exe`

然后:echo $VAR,这时就能在控制台显示正确的UTF-8字符串。
为了验证VAR确实保存UTF-8字符串,我echo $VAR > out.txt,检查out.txt也是UTF-8编码的。

另外:
echo "字符串" > out.txt,out.txt也是UTF-8编码的。
cat out.txt,当out.txt为GBK时不能正确显示;当out.txt为UTF-8时可以正确显示,并且cat out.txt > out2.txt,out2.txt也是UTF-8编码的。

[Linux下的UTF-8字符输出实验]

为了搞清楚,我将源程序文件原封不动的拷贝到Debian下,Linux gcc 4.3.0编译,用od查看编译后程序,里面的字符串也是UTF-8的。程序在gnome-terminal下的bash中执行,能够正确显示字符串。原先以为这是我将bash环境的LC_XXX设置为UTF-8的原因,但是我用export LANG="zh_CN.GBK"后,程序还是能正确显示字符串,最后发现是gnome-terminal的字符编码影响了程序输出字符串的显示:如果将gnome-terminal的字符编码设为GBK,就则会显示出错。

[怎样在Cygwin下显示UTF-8字符]

我在Cygwin bash下用export LANG="zh_CN.UTF-8",但还是无法正确显示自己程序输出的UTF-8字符,于是我想是不是显示字符串和bash的locale设定没关系,而和下层的控制台设备的活动字符编码有关。

对于显示UTF-8编码的字符串,大家有什么建议和方法呢?
为什么Cygwin自己的程序,例如:cat、echo,它们输出的UTF-8字符串就能正确显示呢?实际上Cygwin的cat在bash、cmd上都能正确显示UTF-8字符串。

P.S.

其实有一个不很好的办法,让bash、cmd显示UTF-8字符串:
先chcp.com 65001将控制台活动代码页改为UTF-8的,然后在控制台的属性->字体中选择合适的字体,就能显示UTF-8字符,但是可选的字体似乎只有一个:Lucida Console,用这个字体第一次显示输出的字符串时,字符串只显示半截,然后将控制台窗口遮蔽到其它窗口后,再弹到最前时,整个字符串才显示出来,这个问题似乎和控制台呈现字体的图形操作有关。

论坛徽章:
0
发表于 2010-01-20 16:07 |显示全部楼层
我也想知道!在cygwin下不能使用中文很郁闷~

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
发表于 2010-01-20 16:29 |显示全部楼层
cygwin.jpg

论坛徽章:
0
发表于 2010-01-20 18:28 |显示全部楼层
我刚看了这小伙的笔记,感觉Cygwin自己的包中的程序可以正确显示UTF-8字符,而我自己编译的程序就不行,可能是因为我用MinGW GCC编译原因,我下了个Cygwin的GCC 4,编译了同一份代码,果然如此!结果可以在cmd、Cygwin bash下正确显示UTF-8字符了。

总结:

MinGW带的RT库,比较native,会原封不动的将字符串数组传给console设备;而Cygwin带的RT库,在程序中要求的是UTF-8编码的字符串,但传给console设备前,会将它转换为native的ANSI编码——GBK,所以console可以最终显示正确的字符串。

Cygwin gcc果然比MinGW gcc更像Linux gcc!


所以最终会出现一个很有意思的现象:

我用一份代码,分别用MinGW gcc和Cygwin gcc编译,生成2个程序,prog1,prog2,执行

prog1 > out1.txt
prog2 > out2.txt

out1.txt 和 out2.txt 字节内容完全一样,都是UTF-8编码。但:

prog1(MinGW gcc编译的)在bash和cmd中显示结果错误,而prog2(Cygwin gcc编译的)显示结果正确。

我很奇怪,MinGW和Cygwin,它们的RT库,不都移植自GNU libc么,怎么还有这区别?

--------------

另外,2楼的同学,你说Cygwin不能使用中文,是指的什么情况下使用中文,我新下的Cygwin环境,默认安装、配置,中文支持很好啊,起码bash是这样的,ls、cat、echo、cd都行,bash下输入中文,也不需要特殊设置,Windows自己的输入法就可以,用搜狗拼音写个:echo "这是中文",很简单,也能显示,重定向到文件,就是按UTF-8保存的。

[ 本帖最后由 silon212 于 2010-1-20 18:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP