掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4923|回复: 17

[求助] vba如何正确地输出UTF-8编码文件

[复制链接]

该用户从未签到

发表于 2013-7-17 11:23:21 | 显示全部楼层 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。
, X+ D2 v, J2 z2 E加上vba,就更是如虎添翼,是词典制作的好帮手。- Y: y) G7 g+ c. F
不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。% ]) h% G3 U$ N: `- V4 `( K5 e

, @1 R& X8 n! y. R, M, WExcel文件:
$ ^' d  L8 i8 G$ Q$ v* o; X

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?免费注册

x

评分

1

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1924 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 11:36:32 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑
    / y7 ~: `: N9 `4 ^' U9 D
    9 @+ _2 i. G8 R9 X7 y1 ehttp://blog.sina.com.cn/s/blog_40350cc7010006ch.html  @! ?1 R, \+ U' }
    http://www.phpfans.net/article/htmls/201104/MzM2NzM0.html, P, ]" e7 K. I' P* [1 Y
    http://www.idiandian.com/communi ... 9b58d8db/page1.html
    6 t; g+ F3 O4 B' x7 a8 C: f) d* T9 X* J楼主又准备制作什么经典字典?{:soso_e179:}* j1 r4 U/ V5 Z/ [
    有什么问题,可以先baidu再google

    该用户从未签到

     楼主| 发表于 2013-7-17 12:51:51 | 显示全部楼层
    非常感谢您的回复。
    4 r5 w9 h& V4 L: P1 @不过那些方法也试过,不行。5 B) V  {, E" _, [
    您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1924 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 13:02:19 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 13:07 编辑 ( v! ~, v4 J: [. [$ N. q) V8 X
    7 U( p/ o% Q/ e8 |* c) a
    再尝试这个:
    / L9 k5 V; m/ E* J3 dhttp://stackoverflow.com/questio ... vba-export-to-utf-8
    6 t2 J1 [  f, T( c) k; F; Ghttp://www.knowexcel.com/view/66 ... -file-with-vba.html
    * t- X: I+ v: Thttp://club.excelhome.net/thread-513237-1-1.html

    该用户从未签到

    发表于 2013-7-17 14:38:03 | 显示全部楼层
    实在不行就先输出utf-16, 然后再找工具转成utf-8...

    该用户从未签到

     楼主| 发表于 2013-7-17 15:51:25 | 显示全部楼层
    感谢老大出面。# X0 ?% j, i  d( i1 B4 G

    1 _9 \0 t0 T; T我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。* H: R% ?/ l! e$ S  Q: b
    ) B  x. h1 F+ [
    现在的情况主要是:
    7 t; l' [& j+ g单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。
    , c( {" K+ ]- b) f就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1924 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 17:09:48 | 显示全部楼层
    如果你用editplus,只要excel保存是cvs格式。再前者打开另存为utf-8就行了{:soso_e127:}

    该用户从未签到

     楼主| 发表于 2013-7-17 17:48:25 | 显示全部楼层
    你不明白我的需求。excel 整体存取,什么编码都没有问题。8 L: c2 M& k; v: x

    6 _' c9 h: J+ I- }3 s, X而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。# n  ]: {* n4 D" h
    例如,我有数据:
    " k; I* |& C, b列:A列 B列 C列5 D  e! u" ~7 X1 s
    数据:a b c
    ; [+ _( A2 E$ B3 O( j9 s; D% I上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:
    * K: b# P( @; oa  f1 U) A0 F* g8 Y% z
    a+c+<a href=.........b.......</a>) X. Z6 m& r' H! Q: D- ?' L$ V/ n+ ?
    </>' b3 h. a/ \( v$ L0 V* [' ^1 n3 J1 z( M
    总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。! _" X- t& u/ ^! a" L
    网上找的办法也不行。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1924 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 18:27:10 | 显示全部楼层
    http://d.hatena.ne.jp/niemands/20090316/1237225383
    7 o% R+ A5 b2 K8 K& s再看一个日的

    该用户从未签到

    发表于 2013-7-17 19:17:29 | 显示全部楼层

    1. ' v) R$ t. `% B  K( m
    2. + f7 ^' ?9 `$ B  a% M" F: ]
    3. A        B        C6 ]8 ~7 q) b( f
    4. 3 z: A5 }) J* w! r5 r9 g2 I& U' ]4 N- H
    复制代码
    可以直接使用正则替代啊:, A0 _, e4 y1 M: L% v& a
    \r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n1 N8 E  {/ p) R& j( E
    替代为:# T" Z) J. J/ y3 N: m9 d; T
    \r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n& [/ _) R# X7 j6 Z# e3 J

    / f- [# R8 v8 u; c  _" ]1 F/ e就会成为:

    1. 8 k3 u' x: E: u. W$ z9 X
    2. 8 X/ X# M* ~+ }" o" l+ u
    3. A
      . V# a8 i2 l5 }1 _7 \
    4. A B <a href="entry://C">
      7 }7 s2 `. n% k8 j. \; r, V7 v9 B
    5. </>2 q3 b5 M; e' a; \
    6. # t' W/ `* M6 g
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-17 19:38:27 | 显示全部楼层
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑 & |) Q  p% l1 x8 U
    # ~! u0 f1 m- u' s
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。! i: c& r4 J7 q+ r6 z. N" s
    把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。. c! K& `  i0 z' [
    1 x, @7 ]8 Z  q& Z
    ; ^( b5 C7 P; V2 y( `/ C2 I' U
    另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    发表于 2013-7-17 19:59:36 | 显示全部楼层
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑
    * p4 ^. G" \8 q" ?) `
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    ' f' w! d+ h8 X9 v, E把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...
    + m) d0 ~; t& wsunsmile23 发表于 2013-7-17 19:38

    ' E" a5 P- q  P& ~/ e其实用正则表达式http://baike.baidu.com/view/94238.htm)只多了一步而已。数据是.xls还是.txt,本质上都是一样的,前者有tab而已,txt间隔合适的话可以直接导入Excel。我其实一般都是新建一列(或多列,插入位置看情况,最后一列一般是</>),然后把Excel的内容复制(懒得另存为txt)到文本编辑器(一般UE或者EditPlus),再把tab(以及其他标记性的内容)替换成空格或者换行之类的就OK了。
    ( A/ O/ [4 Z! \' s* w1 l. n- ~chigre的办法更高阶,一步就搞定了,用到了 (?<sub>.*?) ,都不需要在Excel中操作。他的替换应该是在文本编辑器(Notepad++, UltraEdit, EditPlus, EmEditor等)中对txt等操作的。

    该用户从未签到

     楼主| 发表于 2013-7-17 20:15:11 | 显示全部楼层
    赞!真高手,炉火纯青!

    该用户从未签到

    发表于 2013-7-20 10:58:44 | 显示全部楼层
    本帖最后由 i-wiki 于 2013-7-20 20:04 编辑 5 {6 |6 j1 k4 v; E2 ~% R1 E

    + w* [2 _, }+ V; Z为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。, X. ~. I/ f4 a3 q; _
    程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。
    - }" ], {# O( F( w& kADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main()
      % J' k; X+ w6 z! J6 T$ h) [4 u
    2. Dim i As Integer6 @% A: l1 B) w4 W% w, h* q3 k
    3. Dim sft As String
      " U: O1 q2 `1 i. E9 |2 k
    4. Dim spy As String' H! A8 Z0 w2 M9 [9 z. L
    5. Dim szm As String" ~  K: @& T- e% u3 l% S
    6. Dim s As String
      ' a& z+ E1 q& \( _' n; b
    7. Dim Stm As New ADODB.Stream
      ' x8 N2 k9 V  I
    8. $ ~; K! a- R0 r1 S% i2 e! v. p6 ]
    9. Stm.Type = adTypeText; @5 O; \6 [: L% Z) |
    10. Stm.Mode = adModeUnknown! U5 r3 s* J8 B$ _
    11. Stm.Open
      9 }6 @/ U! ~% V/ f6 z/ @! v
    12. Stm.Charset = "utf-8"
      * O3 V; K5 z3 @

    13. - {4 I, r' K- ?/ W
    14. For i = 1 To 72 o8 N& `$ h' {7 |5 j# ^0 a
    15. sft = Cells(i, 1)- l: \# A5 h, D3 Z2 |
    16. szm = Cells(i, 2)
      5 N9 z1 d9 u9 x& r: {% W* R
    17. spy = Cells(i, 3)  G, o. K+ U# i! O9 }
    18. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm
      ) Z4 x- R! A& A. }* c

    19. 1 t" {0 P9 f& \+ S' E2 S
    20. Stm.WriteText s & vbLf
      3 {# i/ G9 K1 u3 m( Q
    21. Next# O- b$ `. N0 j) z# h8 s% x

    22. + G* }9 D* F3 N# F# x
    23. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"# }" h( n. @$ g
    24. Stm.SaveToFile "z:\vba.txt"
      , s3 P- W, C( ?1 `% M
    25. Stm.Close
      / a* r, ]2 v: t9 N
    26. End Sub! {0 s8 P  V2 x8 l: r( w$ M$ H' d
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-20 15:18:51 | 显示全部楼层
    非常感谢!解决一个大问题!
    + [* d7 D; j: a) ~( q% i
    * l4 R8 I6 c9 O, M% M5 sworks perfectly!
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1924 天

    [LV.Master]伴坛终老

    发表于 2013-7-20 20:21:52 | 显示全部楼层
    我也准备说了,想不到已经有人回答。对实现不行,就用vba调用win32 api。基本啥都能干。) h# V7 N# `7 S
    而且vbs调用vba再操作win32 api,这样处理就更强。不用等把所有文件内容显示完再处理...

    该用户从未签到

    发表于 2013-11-24 17:53:14 | 显示全部楼层
    学习了
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-5-5 03:35 , Processed in 0.061977 second(s), 16 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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