ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 50956|回复: 31

[分享] 使用Adodb.Stream判断文件编码及进行编码转换(Unicode,Utf-8,GB2312等)

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2012-5-15 13:06 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:文本处理和正则
本帖最后由 liucqa 于 2012-11-10 10:54 编辑
  1. Sub FileZM(sFile As String, sCode As String, dFile As String, dCode As String)
  2. '参数:源文件,源文件编码,目标文件,目标文件编码。编码举例----"gb2312"、"UTF-8"等
  3. Dim ObjStream As Object

  4. Set ObjStream = CreateObject("Adodb.Stream")
  5. With ObjStream
  6.     .Mode = 3         'adModeReadWrite = 3 ' 指示读/写权限。
  7.     .Type = 1         'adTypeBinary = 1
  8.     .Open
  9.     .LoadFromFile sFile   '源文件

  10.     .Position = 0
  11.     .Type = 2         'adTypeText = 2
  12.     .Charset = sCode
  13.     sCode = .ReadText '读取文本到sCode
  14.    
  15.     .Position = 0     ' 这只是定位到文件头,保留
  16.     .SetEOS           ' 完全重写不要漏了这个,通过使当前 Position 成为流的结尾来更新 EOS 属性的值。当前位置后面的所有字节或字符都将被截断
  17.     .Type = 2         'adTypeText = 2
  18.     .Charset = dCode       '指定输出编码
  19.     .WriteText sCode       '写入指定的文本数据到Adodb.Stream
  20.      .SaveToFile dFile, 2
  21.     .Close
  22. End With
  23. Set ObjStream = Nothing
  24. End Sub
复制代码



附上ADODB.Stream组件Charset属性值

  1. ANSI_X3.4-1968|iso-8859-1
  2. ANSI_X3.4-1986|iso-8859-1
  3. arabic|iso-8859-6
  4. ascii|iso-8859-1
  5. ASMO-708
  6. Big5
  7. chinese|gb2312
  8. CN-GB|gb2312
  9. cp1256|windows-1256
  10. cp367|iso-8859-1
  11. cp819|iso-8859-1
  12. cp852|ibm852
  13. cp866|ibm866
  14. csASCII|iso-8859-1
  15. csbig5|big5
  16. csEUCKR|ks_c_5601-1987
  17. csEUCPkdFmtJapanese|euc-jp
  18. csGB2312|gb2312
  19. csISO2022JP|_iso-2022-jp$ESC
  20. csISO2022KR|iso-2022-kr
  21. csISO58GB231280|gb2312
  22. csISOLatin1|windows-1252
  23. csISOLatin2|iso-8859-2
  24. csISOLatin4|iso-8859-4
  25. csISOLatin5|iso-8859-9
  26. csISOLatinArabic|iso-8859-6
  27. csISOLatinCyrillic|iso-8859-5
  28. csISOLatinGreek|iso-8859-7
  29. csISOLatinHebrew|iso-8859-8
  30. csKOI8R|koi8-r
  31. csKSC56011987|ks_c_5601-1987
  32. csShiftJIS|shift_jis
  33. csUnicode11UTF7|utf-7
  34. csWindows31J|shift_jis
  35. cyrillic|iso-8859-5
  36. DOS-720
  37. DOS-862
  38. DOS-874
  39. ECMA-114|iso-8859-6
  40. ECMA-118|iso-8859-7
  41. ELOT_928|iso-8859-7
  42. euc-jp
  43. euc-kr
  44. Extended_UNIX_Code_Packed_Format_for_Japanese|euc-jp
  45. GB2312
  46. GBK|gb2312
  47. GB_2312-80|gb2312
  48. greek|iso-8859-7
  49. greek8|iso-8859-7
  50. hebrew|iso-8859-8
  51. hz-gb-2312
  52. IBM367|iso-8859-1
  53. ibm819|iso-8859-1
  54. ibm852
  55. ibm866
  56. iso-2022-jp
  57. iso-2022-kr
  58. iso-8859-1
  59. iso-8859-11|windows-874
  60. iso-8859-2
  61. iso-8859-3
  62. iso-8859-4
  63. iso-8859-5
  64. iso-8859-6
  65. iso-8859-7
  66. iso-8859-8
  67. ISO-8859-8 Visual|iso-8859-8
  68. iso-8859-8-i
  69. iso-8859-9
  70. iso-ir-100|iso-8859-1
  71. iso-ir-101|iso-8859-2
  72. iso-ir-110|iso-8859-4
  73. iso-ir-111|iso-8859-4
  74. iso-ir-126|iso-8859-7
  75. iso-ir-127|iso-8859-6
  76. iso-ir-138|iso-8859-8
  77. iso-ir-144|iso-8859-5
  78. iso-ir-148|iso-8859-9
  79. iso-ir-149|ks_c_5601-1987
  80. iso-ir-58|gb2312
  81. iso-ir-6|iso-8859-1
  82. ISO646-US|iso-8859-1
  83. iso8859-1|iso-8859-1
  84. iso8859-2|iso-8859-2
  85. ISO_646.irv:1991|iso-8859-1
  86. iso_8859-1|iso-8859-1
  87. iso_8859-1:1987|iso-8859-1
  88. iso_8859-2|iso-8859-2
  89. iso_8859-2:1987|iso-8859-2
  90. ISO_8859-4|iso-8859-4
  91. ISO_8859-4:1988|iso-8859-4
  92. ISO_8859-5|iso-8859-5
  93. ISO_8859-5:1988|iso-8859-5
  94. ISO_8859-6|iso-8859-6
  95. ISO_8859-6:1987|iso-8859-6
  96. ISO_8859-7|iso-8859-7
  97. ISO_8859-7:1987|iso-8859-7
  98. ISO_8859-8|iso-8859-8
  99. ISO_8859-8:1988|iso-8859-8
  100. ISO_8859-9|iso-8859-9
  101. ISO_8859-9:1989|iso-8859-9
  102. koi|koi8-r
  103. koi8-r
  104. koi8-ru
  105. korean|ks_c_5601-1987
  106. KSC5601|ks_c_5601-1987
  107. KSC_5601|ks_c_5601-1987
  108. ks_c_5601|ks_c_5601-1987
  109. ks_c_5601-1987
  110. ks_c_5601-1989|ks_c_5601-1987
  111. l1|windows-1252
  112. l2|iso-8859-2
  113. l4|iso-8859-4
  114. l5|iso-8859-9
  115. latin1|iso-8859-1
  116. latin2|iso-8859-2
  117. latin4|iso-8859-4
  118. latin5|iso-8859-9
  119. logical|windows-1255
  120. ms_Kanji|shift_jis
  121. shift-jis|shift_jis
  122. shift_jis
  123. unicode
  124. unicode-1-1-utf-7|utf-7
  125. unicode-1-1-utf-8|utf-8
  126. unicode-2-0-utf-8|utf-8
  127. unicodeFFFE
  128. us|iso-8859-1
  129. us-ascii|iso-8859-1
  130. utf-7
  131. utf-8
  132. visual|iso-8859-8
  133. windows-1250
  134. windows-1251
  135. windows-1252
  136. windows-1253
  137. Windows-1254|iso-8859-9
  138. windows-1255
  139. windows-1256
  140. windows-1257
  141. windows-1258
  142. windows-874
  143. x-ansi|windows-1252
  144. x-cp1250|Windows-1250
  145. x-cp1251|Windows-1251
  146. x-euc|euc-jp
  147. x-euc-jp|euc-jp
  148. x-ms-cp932|shift_jis
  149. x-sjis|shift_jis
  150. x-unicode-2-0-utf-7|utf-7
  151. x-unicode-2-0-utf-8|utf-8
  152. x-user-defined
  153. x-x-big5|big5
  154. _autodetect
  155. _autodetect_all
  156. _autodetect_kr
  157. _iso-2022-jp$ESC
  158. _iso-2022-jp$SIO
复制代码


评分

5

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-15 13:50 | 显示全部楼层
本帖最后由 liucqa 于 2013-12-27 16:46 编辑

'字符集编码转换函数,将任意字符集转换成BSTR
  1. Function Bytes2Bstr(body,chrset)
  2. dim objStream
  3. set objStream = Server.CreateObject("adodb.stream")
  4. objStream.Type = 1 'adTypeBinary
  5. objStream.Mode =3 'adModeReadWrite
  6. objStream.Open
  7. objStream.Write body
  8. objStream.Position = 0
  9. objStream.Type = 2 'adTypeText
  10. objStream.Charset = chrset
  11. Bytes2Bstr = objStream.ReadText
  12. objStream.Close
  13. set objStream = nothing
  14. End Function
复制代码



直接转换的函数

TA的精华主题

TA的得分主题

发表于 2012-5-15 14:50 | 显示全部楼层
请问怎么知道一个文件的编码方式呢?
还有adodb.stream可以直接连接读取一个文件里的数据吗?(刚刚学了adodb.connection里的recordset,还没接触stream)

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-5-15 14:57 | 显示全部楼层
本帖最后由 liucqa 于 2012-11-10 10:56 编辑
awnuwfkd 发表于 2012-5-15 14:50
请问怎么知道一个文件的编码方式呢?
还有adodb.stream可以直接连接读取一个文件里的数据吗?(刚刚学了ado ...

利用ADODB.Stream判断文件编码2008-03-14 15:49ANSI无格式定义
EFBB      BF UTF-8
FFFE      UTF-16/UCS-2, little endian
FEFF      UTF-16/UCS-2, big endian
FFFE 0000 UTF-32/UCS-4, little endian
0000 FEFF UTF-32/UCS-4, big endian

  1. function checkcode(path)
  2.     set objstream=server.createobject("adodb.stream")
  3.     objstream.Type=1
  4.     objstream.mode=3
  5.     objstream.open
  6.     objstream.Position=0
  7.     objstream.loadfromfile path
  8.     bintou=objstream.read(2)
  9.     If AscB(MidB(bintou,1,1))=&HEF And AscB(MidB(bintou,2,1))=&HBB Then
  10.         checkcode="utf-8"
  11.     ElseIf AscB(MidB(bintou,1,1))=&HFF And AscB(MidB(bintou,2,1))=&HFE Then
  12.         checkcode="unicode"
  13.     Else
  14.         checkcode="gb2312"
  15.     End If
  16.     objstream.close
  17.     set objstream=nothing
  18. end function

复制代码



UTF8文件有BOM和No BOM两种,其区别在于BOM多了三个字节(EFBBBF),对比了二进制文件,发现有这个区别,如果是NoBOM的文件就无法通过前两个字节判断是否为UTF-8文件。

对于没有BOM的UTF-8文件,可以通过遍历判断是否为UTF-8编码。遍历方法可以是二进制的移位判断或者是正则。


评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-11-10 08:10 | 显示全部楼层
liucqa 老师您好,我想转换xml的编码从UTF到ansi,用您的编码转换为什么中文字符会变成“???”
Sub FileZM(sFile As String, sCode As String, dFile As String, dCode As String)
Dim ObjStream As Object

Set ObjStream = CreateObject("Adodb.Stream")
With ObjStream
    .Mode = 2         'adModeReadWrite = 3 ' 指示读/写权限。
    .Type = 1         'adTypeBinary = 1
    .Open
    .LoadFromFile sFile   '源文件

    .Position = 0
    .Type = 2         'adTypeText = 2
    .Charset = sCode
    sCode = .ReadText '读取文本到sCode
   
    .Position = 0     ' 这只是定位到文件头,保留
    .SetEOS           ' 完全重写不要漏了这个,通过使当前 Position 成为流的结尾来更新 EOS 属性的值。当前位置后面的所有字节或字符都将被截断
    .Type = 2         'adTypeText = 2
    .Charset = dCode       '指定输出编码
    .WriteText sCode       '写入指定的文本数据到Adodb.Stream
     .SaveToFile dFile, 2
    .Close
End With
Set ObjStream = Nothing
End Sub

Private Sub CommandButton4_Click()
FileZM "C:\Users\User\Desktop\life\life.xml", "UTF-8", "C:\Users\User\Desktop\life\2.xml", "iso-8859-1"
End Sub

life.zip

16.08 KB, 下载次数: 84

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 10:57 | 显示全部楼层
明天の晨曦 发表于 2012-11-10 08:10
liucqa 老师您好,我想转换xml的编码从UTF到ansi,用您的编码转换为什么中文字符会变成“???”
Sub FileZM ...

life.rar (17.16 KB, 下载次数: 440)

你不要乱改代码

TA的精华主题

TA的得分主题

发表于 2012-11-10 11:45 | 显示全部楼层
谢谢老师,但是我改成ansi为啥还是问号呢

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-11-10 11:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 liucqa 于 2012-11-10 11:50 编辑
明天の晨曦 发表于 2012-11-10 11:45
谢谢老师,但是我改成ansi为啥还是问号呢

你百度一下 ansi,先理解什么是编码吧

TA的精华主题

TA的得分主题

发表于 2012-11-10 11:53 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-11-10 12:13 | 显示全部楼层
多谢分享,收藏备用!{:soso_e179:}
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-27 10:53 , Processed in 0.046544 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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