十年磨一劍--從程序員到架構師

一个.net程序员,一个企业应用的开发者,喜欢系统架构,数据库,领域驱动,面向对象,表现层技术。关注重用的理论和实践。设计原则:简单,快速,适应变化能力强,表现层灵活多变...

博客园 首页 新随笔 联系 订阅 管理

用控制台写一些简单的程式,是一个很不错的选择。

不过windows下的console,却输出不了utf-8格式的文字,通过网友和自己尝试,有以下方法

 

第一种

繁体操作系统,chcp为950

C#写的Console程式运行起来时,显示不了简体字?Console.WriteLine(不过可以输入简体字Console.ReadLine)

image

 

找遍网络,发现了一种还算行的解决方法

a.改变当前字符集为65001(utf8)

image

b.设定字型

image

c.界面会乱掉,不过还是可以正常运行

image

d.最小化一下cmd窗口,然后再回来,即可看得到已还原的正常界面

image

 

第二种

英文操作系统,chcp为437,直接chcp 950报错(原因不明)

image

chcp 65001,然后修改字体后也不行,显示一些方块

 

1.于是只好先改注册表,先改为950

image

image

2.重新打开cmd,chcp后发现是950

然后修改字体,这时候可以显示汉字了

然后再chcp 65001(记得一定是先修改console的font,然后再chcp)

这样就可以正常运行console的输出简体字和繁体字的程式了

image

 

 

好了,到此为止

下面再看一个没有作过任何修改的chcp950的cmd

发现dir命令可同时显示简繁体的文件名

image

可type命令也显示含有简体字的文本文件内容,不过该文件必须以unicode格式存储,utf-8格式存储则会显示乱码

 image

 

说明控制台确实可以在不改变任何设定的情况下输出unicode字符,即同时显示简体和繁体

type,dir命令是如何调用标准输出的?

是一个疑问

留待以后有空研究,看是否可以让C#的Console.WriteLine也具备此项功能

 

 

 

附一些关于windows默认字符集的看法:

1.windows系统有一个默认字符集,也叫内码页,在windows中此格式叫做ansi字符集

ansi字符集在不同的操作系统中对应的字符集也不一样

936(GB2312):简体操作系统

950(big5):繁体操作系统

437:英文操作系统

 

这个字符集兼容ASCII

并且扩展部分采用双字节

 

因此unicode和utf8是不行的

前者一般是两字节显示,后者则可能有三字节显示

 

windows关于默认字符集的设定是在

控制面板-->地区及语言选项—>Advanced-->选择非unicode的默认字符集(更改此选项,需要重启电脑)

 

至于为什么需要一个这样的设定,全世界都用unicode不行吗?

可能是因为:

GB2312,Big5格式的文本文件,完全没办法区分

因此windows在碰到此类文件时,需要有一个选项说明用何种字符集来读,这就是默认的内码页

当然,瀏覽器解析html可以根据meta标签的charset来选用,而不用默认字符集

xml的第一行也可以说明charset是什么

 

另外,如果是unicode(包括big endian),utf-8则有标志,即文本文件的开头有一些特殊的字节,用以说明现在的文件是什么格式的

 

 

2.windows系统本身应该使用的是unicode

如资料夹名称,文件名称既可以使用简体,也可以使用繁体

还有就是你写的程式,如果有字符串变量,这个字符串变量在exe中是以unicode存储的

 

UCS = Unicode Character Set = Unicode

UCS-2:表示Unicode 16,即用2个字节表示,65536个字符

UCS-4:则是Unicode 32,4个字节的完整unicode

 

2010.10.20 13:09 补录

如果是C#写的Console程式,并且要在windows排定的工作中运行,则需要设定以下键值

 

posted on 2010-10-20 11:51  Kevin Zou  阅读(15337)  评论(0编辑  收藏  举报