java写⼊⽂件编码格式为ansi_ANSI是什么编码?
作者:malecrab
本⽂字数:2246,阅读时长:3分钟
⽤Notepad++创建⼀个⽂本⽂件,其默认编码格式为ANSI(乍看之下,还以为是ASCII呢),输⼊汉字居然不是乱码:
保存为,发送给你美国的同事Bob。他也⽤Notepad++,不幸的是,却发现你的⽂件内容是这样的:
java语言使用的字符码集是也许你会认为:你⽤的是中⽂系统,能正常显⽰中⽂;他⽤的是英⽂系统,不能显⽰中⽂!
这么想,好像很有道理呢!
但是再细想⼀下:⼀个系统显⽰乱码,说明它不⽀持这种编码格式(或者解码⽅式不对)。难道英⽂系统不⽀持ANSI?难道ANSI是⼀种中⽂编码?
如果你⾝边有⼀个韩⽂系统,也装⼀个Notepad++,默认还是ANSI编码,你可以输⼊“ ”,发现也能正常显⽰:
但是你要输⼊“汉字”可能就会发现是乱码了...
通过这个反例,就可以说明ANSI不是⼀种中⽂编码。那么,ANSI到底是什么编码?
⽤⼗六进制编辑器打开内容为“汉字”的⽂件:
你会发现:其中baba和d7d6正好是“汉”和“字”两个字的GBK编码值。
同样,⽤⼗六进制编辑器打开内容为“ ”的⽂件:
你会发现:其中c7d1、b1b9和beee正好是“ ”、“ ”和“ ”三个字符的EUC-KR编码值。
由此可以看出:其实ANSI并不是某⼀种特定的字符编码,⽽是在不同的系统中,ANSI表⽰不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码(ASCII编码不能表⽰汉字,所以汉字为乱码),⽽你的系统中(“汉字”正常显⽰)ANSI编码其实是GBK编码,⽽韩⽂系统中(“ ”正常显⽰)ANSI编码其实是EUC-KR编码。
话说计算机是由美国佬搞出来的嘛,他们觉得⼀个字节(可以表⽰256个编码)表⽰英语世界⾥所有的字母、数字和常⽤特殊符号已经绰绰有余了(其实ASCII只⽤了前127个编码)。后来欧洲⼈不⼲了,法国⼈说:我需要在⼩写字母加上变⾳符号(如:é),德国⼈说:我也要加⼏个字母(Ää、Öö、Ü ü、ß)。于是,欧洲⼈就将ASCII没⽤完的编码(128-255)为⾃⼰特有的符号编码(后来称之为“扩展字符集”)。等到我们中国⼈开始使⽤计算机的时候,,256个编码哪够?我泱泱⼤中华,汉字起码也得N多万吧,就连⼩学⽣都得要求掌握两三千字。国标局最后拍板:⼀个字节不够,那我们就⽤多个字节来为汉字编码吧,但是,国情那么穷,字节那么贵,三个字节伤不起,那就⽤俩字节吧,先给常⽤的⼏千汉字
编个码,等以后国家强盛了⼈民富裕了,咱再扩展呗---于是GB2312就产⽣了。台湾同胞⼀看,,全是简体字,还让不让我们写繁体字的活了,于是台湾同胞也⾃⼰弄了个繁体字编码---⼤五码(Big-5)。同时,其它国家也在为⾃⼰的⽂字编码。最后,微软苦逼了:顾客就是上帝啊,你们的编码我都得满⾜啊,这样吧,卖给美国国内的系统默认就⽤ASCII编码吧,卖给中国⼈的系统默认就⽤GBK编码吧,卖给韩国⼈的系统默认就⽤EUC-KR编码,...但是为了避免你们误会我卖给你们的系统功能有差异,我就统⼀把你们的默认编码都显⽰成ANSI吧。---本故事纯属虚构,但“ANSI编码”确实只存在于Windows系统。
那么Windows系统是如何区分ANSI背后的真实编码的呢?
微软⽤⼀个叫“Windows code pages”(在命令⾏下执⾏chcp命令可以查看当前code page的值)的值来判断系统默认编码,⽐如:简体中⽂的code page值为936(它表⽰GBK编码,win95之前表⽰GB2312,详见:Microsoft Windows' Code Page 936),繁体中⽂的code page值为950(表⽰Big-5编码)。
我们能否通过修改Windows code pages的值来改变“ANSI编码”呢?
命令提⽰符下,我们可以通过chcp命令来修改当前终端的active code page,例如:
(1) 执⾏:chcp 437,code page改为437,当前终端的默认编码就为ASCII编码了(汉字就成乱码了);
(2) 执⾏:chcp 936,code page改为936,当前终端的默认编码就为GBK编码了(汉字⼜能正常显⽰了)。
上⾯的操作只在当前终端起作⽤,并不会影响系统默认的“ANSI编码”。(更改命令⾏默认codepage参看:设置cmd的codepage的⽅法)。
Windows下code page是根据当前系统区域(locale)来设置的,要想修改系统默认的“ANSI编码”,我们可以通过修改系统区域来实现(“控制⾯板” =>“时钟、语⾔和区域”=>“区域和语⾔”=>“管理”=>“更改系统区域设置...”):
图中的系统locale为简体中⽂,意味着当前“ANSI编码”实际是GBK编码。当你把它改成Korean(Korea)时,“ANSI编码”实际是EUC-KR编码,“ ”就能正常显⽰了;当你把它改成English(US)时,“ANSI编码”实际是ASCII编码,“汉字”和“ ”都成乱码了。(改了之后需要重启系统的。。。)
说明:locale是国际化与本地化中重要的概念,本⽂不深⼊讲解该内容。
你上⾯说的都是windows的情形吧,Linux呢?
将前述内容为“汉字”的⽂件拷贝⾄Linux下,⽤Emacs打开:
也是乱码!原因也是locale的问题:
更改locale后再打开:
「新品⾸发」STM32MP157开发板⽕爆预售!⾸批仅300套
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论