[vb]VB文字编码与Windows记事本的探究

来源:互联网 发布:linux 脚本中修改密码 编辑:程序博客网 时间:2024/06/04 19:25

1、微软的记事本程序的问题

微软的记事本,在保存文件的时候,会默认保存成ANSI格式。

网传在记事本中输入“联通”后,不加修改就直接保存为默认的ANSI格式,之后打开就是乱码。

测试结果显示,输入“联通”默认保存后,字节内容是:193,170|205,168

如果按照UNICODE保存“联通”两个字,从记事本保存的文件中,可以提取出的字节序列是:255,254|84,128|26,144


VB自身的字符是Unicode的,而“联通”两个字的Unicode字节序列是:84,128|26,144

从此可以看出:微软的记事本通过为显示的内容增加:255,254这两个字节的数据,来标记Unicode文本。


然后,发现微软的记事本对于ANSI格式文件不做任何的标记。


对于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无Unicode255,254Unicode Big endian254,255UTF-8239,187,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字符。


继续测试:

原创粉丝点击