前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >文件操作——编码

文件操作——编码

作者头像
xyj
发布2020-07-28 10:53:43
1.9K0
发布2020-07-28 10:53:43
举报
文章被收录于专栏:VBA 学习VBA 学习

如果你只用VBA处理Excel的数据的话,一般都不会碰上编码的问题,但是一旦涉及到读取外部数据,就很有可能会碰上编码问题了。

1、什么是编码:

百度百科:

编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。编码在电子计算机、电视、遥控和通讯等方面广泛使用。编码是信息从一种形式或格式转换为另一种形式的过程。解码,是编码的逆过程。

看上面的解释可能还是有点晕,我自己是这样理解:

计算机能够存储的只有0和1,每8个bit为1个byte,所以1个byte能代表2的8次方,也就是256种不同的东西。如果人只看0和1不同的排列组合的话,根本无法区分到底代表了什么内容。

所以,为了方便,前辈们设计出了编码,也就是让电脑根据编码的规则,把所代表的内容显示在显示器上,这样我们就能够看懂了,但是,计算机实际存储的内容是没有改变的。

随着计算机不断的发展,为了尽量能够兼容世界上的语言,编码方案也在不停的发展,也就出现了许多的编码方案。

2、VBA的编码:

VBA对字符串的编码是按照Unicode编码方案里的UTF-16,也就是所有字符都是按照2个Byte来代表。如果你想查看,可以这样:

从图中可以看出,6个字符,需要使用12个容量的Byte数组来存储,你可以baidu查看一下字符a的编码,在ASCII中,a的编码是97,Unicode编码为了兼容ASCII编码,所有的ASCII字符,第2个Byte都是用0。另外我们使用的中文都是用2个Byte代表,

3、Windows系统的编码:

我们在文件操作——读取中,自己手动创建了1个txt文本文档,在把数据读取出来之后,还使用了VBA.StrConv(b, vbUnicode)进行了转换,这个的功能就是把ANSI编码转换成了VBA里的Unicode编码,那为什么我们手动创建的是ANSI编码呢?

我们可以这样查看,打开手动创建的那个txt文本文档,点击文件-另存为:

在这个界面,我们就可以看到这个文本文档的编码了。

所以,如果把新建的txt文本文档另存为,选择编码Unicode,那么,你可以再试试读取的操作,这个时候不需要VBA.StrConv(b, vbUnicode)这条代码了,直接使用str = b,在立即窗口里就可以输出你写的东西。

代码语言:javascript
复制
Sub ReadTxtByOpenBin()
    Dim num_file As Integer
    Dim str As String
    Dim b() As Byte
    
    '获取1个文件号
    num_file = VBA.FreeFile()
    '打开文件
    Open ThisWorkbook.Path & "\test.txt" For Binary Access Read As #num_file
    'VBA.LOF(num_file)返回num_file这个文件的字节数
    ReDim b(VBA.LOF(num_file) - 1) As Byte
    '读取数据,读取的字节数就是数组b的大小
    Get #num_file, 1, b
    '关闭文件
    Close #num_file
    str = b 
    Debug.Print str
End Sub

但是细心查看的话,会发现前面会出现1个问号。这个的原因是系统造成的,如果我们存储为编码Unicode,系统会自动在前面加上2个Byte的东西,16进制的FF和FE。

所以,既然系统是通过前面这2个字节来确认文件是Unicode编码的,那么,我们在文件操作——写入中,如果我们自己先写入那2个标志,再写入我们需要的东西,也可以省略掉StrConv了:

代码语言:javascript
复制
Sub WriteTxtByOpenBin()
    Dim num_file As Integer
    Dim str As String
    
    str = "测试文件写入"
    
    Dim b() As Byte
    '将string转换为byte数组
    b = str
    
    '获取1个文件号
    num_file = VBA.FreeFile
    
    Open ThisWorkbook.Path & "\put.txt" For Binary Access Write As #num_file
    '写入Unicode编码文件头
    Put #num_file, 1, &HFF
    Put #num_file, 2, &HFE
    '写入数据
    Put #num_file, 3, b
    '关闭文件
    Close #num_file
End Sub

这个时候再打开put.txt,你可以看到已经不会乱码了,同时你可以用另存为来查看它的编码,会发现已经变成了Unicode,而不是系统默认的ANSI了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-05-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档