Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2286|回复: 4

[已解决]VBA提取TXT文本内容,编码ANSI和编码UTF-8的区别

[复制链接]
发表于 2022-3-2 14:22 | 显示全部楼层 |阅读模式
在excel提取txt文本的时候,TXT编码ANSI的可以抓取正确的数据,但是编码UTF-8的数据抓取出来会出现乱码。问题1:请前辈们介绍讲解TXT编码在excel中的VBA的区别和用法。

问题2:另外怎么用vba批量去修改txt格式编码?
最佳答案
2022-3-2 17:21
楼主,您好!
关于文本编码格式所涉及的学问较多,一方面我也只了解了皮毛,二来篇幅所限,我在这里简单、挑重点来跟您说一下。
简体中文版Windows系统中,NotePad.txt所支持的(我们经常能接解的)文本编码有三类,分别是ANSI/GB2312、Unicode、UTF-8。
这3种常见编码之间,既存在一定的关联,又有比较大的区别。
以VBA直接读取TXT文件,仅能正确识别及显示ANSI格式的TXT文件的内容。
若强行用VBA直接读取及识别Unicode、UTF-8格式的TXT文件,纯英文还好,中文的话就会出现乱码。
解决的办法很简单,就是读取的同时对文本编码进行转换,转换为VBA能正确识别的编码。
文本编码的转换由来已久,网上有太多太多的方法,我所了解的众多转换方案中,使用ADODB.Stream对象来对字符串编码进行转换是最优方案。
(注:ADODB.Stream对象并非VBA特有,很多其它语言都可以调用它来进行文本编码转换。)
调用ADODB.Stream对象对字符串编码进行转换,其优点在于:一方面代码简短,第二方面就是支持(几乎)所有文本编码之间的互转,功能十分强大。
我以前就做过这类编码转换的对比,我这套现成的实例跟您的情况非常相似,您可以参考一下。
以上基本就回答了您第一个问题了。

至于第二个问题,“直接修改TXT的编码格式”应该不太现实,

我建议的解决方法步骤如下:
1、VBA调用ADODB.Stream对象去读取不同编码的TXT文件,并将其转换为VBA能正确识别的编码(下称“能识别的字符串”)。
2、VBA再次调用ADODB.Stream对象将上面得到的“能识别的字符串”转换成您想要的文本格式(由您指定),然后写入TXT文件,大功告成。
3、如果是批量的话,加个循环就是了。

以上内容希望对您有所帮助。
另外,我上面多次提到“VBA能正确识别的编码”,这种编码其实是一种不含BOM头的Unicode编码。
虽是Unicode编码,但与TXT文件中的Unicode编码有一定的区别(名字一样,却不相同,这不是害人吗?!!但事实就是如此)。
以至于VBA直接读取Unicode编码的TXT文件时也因无法识别而出现乱码。
我也是怕您觉得混乱,所以上面一直没提。
如果您看了以后无法理解,要么您就再百度一下这方面的知识,要么就直接略过此段。
1646202051(1).jpg
1646201791(1).jpg
1646202010(1).jpg

TXT提取内容.rar

32.86 KB, 下载次数: 1

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2022-3-2 17:21 | 显示全部楼层    本楼为最佳答案   
楼主,您好!
关于文本编码格式所涉及的学问较多,一方面我也只了解了皮毛,二来篇幅所限,我在这里简单、挑重点来跟您说一下。
简体中文版Windows系统中,NotePad.txt所支持的(我们经常能接解的)文本编码有三类,分别是ANSI/GB2312、Unicode、UTF-8。
这3种常见编码之间,既存在一定的关联,又有比较大的区别。
以VBA直接读取TXT文件,仅能正确识别及显示ANSI格式的TXT文件的内容。
若强行用VBA直接读取及识别Unicode、UTF-8格式的TXT文件,纯英文还好,中文的话就会出现乱码。
解决的办法很简单,就是读取的同时对文本编码进行转换,转换为VBA能正确识别的编码。
文本编码的转换由来已久,网上有太多太多的方法,我所了解的众多转换方案中,使用ADODB.Stream对象来对字符串编码进行转换是最优方案。
(注:ADODB.Stream对象并非VBA特有,很多其它语言都可以调用它来进行文本编码转换。)
调用ADODB.Stream对象对字符串编码进行转换,其优点在于:一方面代码简短,第二方面就是支持(几乎)所有文本编码之间的互转,功能十分强大。
我以前就做过这类编码转换的对比,我这套现成的实例跟您的情况非常相似,您可以参考一下。
以上基本就回答了您第一个问题了。

至于第二个问题,“直接修改TXT的编码格式”应该不太现实,

我建议的解决方法步骤如下:
1、VBA调用ADODB.Stream对象去读取不同编码的TXT文件,并将其转换为VBA能正确识别的编码(下称“能识别的字符串”)。
2、VBA再次调用ADODB.Stream对象将上面得到的“能识别的字符串”转换成您想要的文本格式(由您指定),然后写入TXT文件,大功告成。
3、如果是批量的话,加个循环就是了。

以上内容希望对您有所帮助。
另外,我上面多次提到“VBA能正确识别的编码”,这种编码其实是一种不含BOM头的Unicode编码。
虽是Unicode编码,但与TXT文件中的Unicode编码有一定的区别(名字一样,却不相同,这不是害人吗?!!但事实就是如此)。
以至于VBA直接读取Unicode编码的TXT文件时也因无法识别而出现乱码。
我也是怕您觉得混乱,所以上面一直没提。
如果您看了以后无法理解,要么您就再百度一下这方面的知识,要么就直接略过此段。

读取和生成不同编码的TXT文件.rar

39.88 KB, 下载次数: 17

回复

使用道具 举报

发表于 2022-3-2 18:21 | 显示全部楼层
搜到这个 , 未测试
VBA转换txt文件编码
https://www.cnblogs.com/mrlajie/p/15569592.html
回复

使用道具 举报

 楼主| 发表于 2022-3-3 09:22 | 显示全部楼层
vitrel 发表于 2022-3-2 17:21
楼主,您好!
关于文本编码格式所涉及的学问较多,一方面我也只了解了皮毛,二来篇幅所限,我在这里简单、 ...

谢谢老师讲解,受益颇多。
回复

使用道具 举报

 楼主| 发表于 2022-3-3 09:23 | 显示全部楼层
砂海 发表于 2022-3-2 18:21
搜到这个 , 未测试
VBA转换txt文件编码
https://www.cnblogs.com/mrlajie/p/15569592.html

谢谢老师,我试试
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-6 03:35 , Processed in 0.239957 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表