记事本在读取一个文本时如何判断是该用啥字符集来读取解析文本字符

来源:互联网 发布:mysql limit实现 编辑:程序博客网 时间:2024/04/27 23:11

例如,一个用于文本显示的软件(的源码)里是存在一个字符集变量的,用来说明该软件是用什么字符集来保存和(读取解析)显示文本字符的。有些软件编码设计时,这个字符集变量的值不是在源码里写死的,而是可以让用户选择其值;有些软件编码设计时,这个字符集变量的值则是在源码里写死的,不能让用户选择其值,例如,Windows系统自带的记事本程序,而它这个写死的字符集变量的值就被称为记事本的默认编码字符集。而记事本的ANSI编码,就是这种默认编码。而我们说记事本程序里字符集变量的值是写死的,是说在记事本程序界面上不能改变的,而记事本程序里字符集变量的值实际上会随着(Windows)操作系统中“系统区域设置”里选定的值改变而改变的。所以,当“系统区域设置”里选定的值为中文(简体,中国)即对应ANSI编码字符集为GBK时,我们保存一个中文文本,之后,将“系统区域设置”里选定的值改为中文(简体,台湾)即对应ANSI编码字符集为BIG5,则在打开读取该文本时,就显示乱码了。当然,记事本程序也不是自能用默认编码字符集来读取解析文本字符,它也支持Unicode的。记事本在读取一个文本时判断是该用啥字符集来读取解析文本字符的过程如下:
记事本读取一段二进制编码,如何确定它是ANSI还是BIG5还是UTF-16/UTF-8?
记事本的做法是在TXT文件的最前面保存一个标签,如果记事本打开一个TXT,发现这个标签,就说明是unicode。标签叫BOM,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF则UTF16BE,如果是0xEF 0xBB 0xBF,则是UTF-8。如果没有这三个东西,那么就用ANSI(即记事本的默认编码字符集),即使用操作系统的默认语言编码来解释。

所谓应用程序使用(Windows)操作系统的字符集作为自己解析文本时所用的字符集 其实就是使用(Windows)操作系统中“系统区域设置”里选定的那个字符集。

当然,还有一些用于文本显示的软件(例如,记事本程序)具有猜文本所用字符集的功能。参考下面一段:
软件打开时如何知道是哪个编码?于是不知道谁蹲坑时想出了BOM:在一个文本文件或者一段字符编码前加上几个固定的字节用于识别,这些字节保证不对应任何一个字符,所以软件一读就能验明正身:
EF BB BF - 我是UTF-8
FF FE - 我是UTF-16LE
FE FF - 我是UTF-16BE
(没有BOM,直奔主题)-你猜?
不错,没BOM只能靠猜了。软件读入文件时可以所有编码都试一下,看哪个像。另外,BOM只针对Unicode系列编码,ANSI通通不会有BOM。很显然,没有BOM难免偶然猜错。网上就流传了一个神奇的段子:打开Windows记事本,打入“联通”两个字,保存,关闭,再打开,变成了个黑块。记事本用ANSI(GB18030)保存联通这两个字,刚好这两个字的GB18030编码看起来很像UTF-16,于是就当成UTF-16来打开……
遇到乱码不怕不怕啦——计算机字符编码详尽讲解
于是,记事本在读取一个文本的具体判断是该用啥字符集来读取解析文本字符的过程如下:
记事本读取一段二进制编码,如何确定它是ANSI还是BIG5还是UTF-16/UTF-8?
如果记事本打开一个TXT,发现BOM标签,就说明是unicode。这个BOM标签,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF则UTF16BE,如果是0xEF 0xBB 0xBF,则是UTF-8。如果没有这个BOM标签,那么记事本读入文件时就所有编码都试一下,看哪个像就用哪个字符集。
附加:
Windows操作系统环境变量lang设置对操作系统默认字符集的影响?
locale
C++之国际化(2) — locale
解决国际化问题,通常是通过locale环境,它被用来封装国家(地域)和文化之间的转换行为。
一个locale就是一个参数和函数的集合。根据X/Open公约,环境变量LANG用来确定当时的locale,
不同的浮点数、日期、货币格式等则根据这个locale确定。
确定一个locale,需要采用以下字符串格式:
language[_area[.code]]
language表示语言,例如英语或者德语
_area表示该语言所处的地域、国家或者文化。用它可以在相同语言的不同国家之间实行转换
code定义字符编码方案,其重要性主要体现在亚洲,因为在那相同的字符集有不同的编码方案,如汉字的BIG5和GB

=============================================================================
记事本程序
当一文件里的当前行上字符输入的长度超过一定数字后该程序会自动在该文件中输入回车换行符
文件中输入回车换行符的另一种情况是人为有意输入
该程序里设置为自动换行后,会根据该程序的窗口的当前宽度为所要显示的文件自动换行,而这个自动换行只是该程序的窗口显示时的一个屏幕上换行的行为现象,并不是说此时真的在文件里添加回车换行符。

程序里的字符集设置变量(由操作系统的字符集文件或是程序的自身字符集文件来解释打开的文件里的字符编码值)设置为对应值(即具体是啥字符集)可以用于解读打开的对应字符集编码值的文件。至于程序自身界面显示的字符可以由操作系统的字符集文件(Windows系统区域设置里的或是Unicode字符集,看程序自己源码里用char(则为前者),还是wchar类型(则为后者))或是程序的自身字符集文件来解释。程序界面的多语言切换显示,实现方式之一是程序界面的一个显示字符串的变量的值为switch同个变量对应不同语言的编码值字符串,程序里的字符集设置变量(即switch右边那个变量)用于选择哪个语言。

0 0
原创粉丝点击