1、微软的记事本程序的问题
微软的记事本,在保存文件的时候,会默认保存成ANSI格式。
网传在记事本中输入“联通”后,不加修改就直接保存为默认的ANSI格式,之后打开就是乱码。
测试结果显示,输入“联通”默认保存后,字节内容是:193,170|205,168
如果按照UNICODE保存“联通”两个字,从记事本保存的文件中,可以提取出的字节序列是:255,254|84,128|26,144
VB自身的字符是Unicode的,而“联通”两个字的Unicode字节序列是:84,144
从此可以看出:微软的记事本通过为显示的内容增加:255,254这两个字节的数据,来标记Unicode文本。
对于Unicode Big endian的编码,则是使用:254,255进行标记。
总结下,以“孙”字保存为例:
203,239 ansi
255,254,89,91 unicode
254,255,91,89 unicode big endian
239,187,191,229,173,153 utf-8
所以各个编码对应的,在NotePad中的标准头分别为:
编码类型 | 文字编码字节内容 |
ANSI | 无 |
Unicode | 255,254 |
Unicode Big endian | 254,255 |
UTF-8 | 239,191 |
接下来,vb中的StrConv函数,是进行字符编码转换的,但是其中的各个常数对应的编码到底是什么关系呢?
下面进行探索。基于这样的一个基础知识:VB6.0中,字符使用的是Unicode编码进行保存。同样,为了节约时间,使用“孙”字进行测试。
Private Sub Command3_Click()
Dim k As String
Dim b() As Byte
k = "孙"
k = StrConv(k,vbFromUnicode)
b = k
Text1.Text = showByte(b)
End Sub
这里将Unicode的“孙”字,用StrConv函数,转换成“vbFromUnicode”(字面上)。从百度的结果看,vbFromUnicode是指系统的默认代码页。
上述代码执行后,返回的结果是:“203,239”,是符合ANSI的“孙”字编码。也就是说,我的系统默认编码页是ANSI,这个vbFromUnicode就是将Unicode字符转换为ANSI字符。
继续测试: