掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 5436|回复: 17

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

[复制链接]

该用户从未签到

发表于 2013-7-17 11:23:21 | 显示全部楼层 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。
. E! @8 X6 X8 o7 W加上vba,就更是如虎添翼,是词典制作的好帮手。, x7 t/ T; |" |9 Y1 v- w* q
不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。
* o, _) y- z" E% }0 C: C& b8 I7 k# X, x# q# L% A3 f7 ~
Excel文件:$ l! [# R8 @1 I3 W4 K

本帖子中包含更多资源

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

x

评分

1

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 2242 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 11:36:32 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑
    ' e3 N. o) t: S* R" w/ C1 a; T+ {+ E, B0 P& ~  W( y  e3 x3 n
    http://blog.sina.com.cn/s/blog_40350cc7010006ch.html
    - g& U) |% `1 |, c- {2 d2 n( v9 Xhttp://www.phpfans.net/article/htmls/201104/MzM2NzM0.html' h; [8 a% Z1 [# R" }
    http://www.idiandian.com/communi ... 9b58d8db/page1.html  `# D- s- i3 u2 x$ ]* i  q
    楼主又准备制作什么经典字典?{:soso_e179:}2 G3 E& F' ^$ m' W! L8 T
    有什么问题,可以先baidu再google

    该用户从未签到

     楼主| 发表于 2013-7-17 12:51:51 | 显示全部楼层
    非常感谢您的回复。  L5 n9 Y' ]. M: g
    不过那些方法也试过,不行。
    ( P- p: J* R0 E! A) M您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 2242 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 13:02:19 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 13:07 编辑 # D1 o+ G: r& z$ Z# h( f! S
    " h3 ]2 ?+ B6 e# p% o, Q
    再尝试这个: ' N. J" Z1 r$ b- U8 ^' d" n# @6 X
    http://stackoverflow.com/questio ... vba-export-to-utf-8
    4 b  |0 o# @; Z- Vhttp://www.knowexcel.com/view/66 ... -file-with-vba.html* K8 E* Q) ]' v. c# H$ u
    http://club.excelhome.net/thread-513237-1-1.html

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2013-7-17 15:51:25 | 显示全部楼层
    感谢老大出面。
    ; ]! A* W, L9 {/ {
    & W6 c& }# g0 [3 z3 x& c% |我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。3 j/ ?$ N2 b& C' e
    $ w, W- [! ^+ i1 J5 F- q; O3 I9 G
    现在的情况主要是:
    & X4 V8 ]% N* i4 E3 A  T2 `! @+ `单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。
    : q; z' d2 H( ]' }" P  s就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 2242 天

    [LV.Master]伴坛终老

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

    该用户从未签到

     楼主| 发表于 2013-7-17 17:48:25 | 显示全部楼层
    你不明白我的需求。excel 整体存取,什么编码都没有问题。
    , X* b0 Z8 L6 ?% L8 {0 V/ f- w6 D7 }9 k/ Z( B+ g5 [. s2 H6 t
    而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。
    # f! E7 f/ w8 e例如,我有数据:$ u& O' u. ]# \' e
    列:A列 B列 C列
    # e3 S3 G" D3 X$ P+ q数据:a b c
    : U2 W7 {7 z9 H+ F: B: v7 I+ i上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:
    9 R8 C" n0 y1 pa
    ! [, I: W) A7 Ga+c+<a href=.........b.......</a>
    7 _5 a6 v1 g# e8 E4 v. o* f</>8 c# u# i7 H- U
    总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。
    0 q; H, p  @4 r9 ]0 o网上找的办法也不行。
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 2242 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 18:27:10 | 显示全部楼层
    http://d.hatena.ne.jp/niemands/20090316/1237225383
    " u0 K* y+ I3 ~; M* F再看一个日的

    该用户从未签到

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

    1. ; j& Z$ F  @. ~3 f& }
    2. ) ?7 k# d+ V3 S! t
    3. A        B        C
      / G- P' O; v' S+ v3 o

    4. ) @, r1 n3 y  ~6 l: Y. r
    复制代码
    可以直接使用正则替代啊:7 `3 X" ?3 w' }3 x
    \r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n- h% j) z' Z0 P
    替代为:
    : a. v, v, w. W' q, E* V7 V\r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n
    - F/ @6 l; A% [7 P
    ( u* M/ R3 e* I0 E0 M! \' Q- \就会成为:

    1. ; O6 a8 q) s, H" t! v! S  E5 X, a
    2. ) U9 g; G( f5 _7 U0 Q
    3. A
      / w- S4 z$ _$ d6 A) i3 T& b
    4. A B <a href="entry://C">  n' e9 p& s3 p
    5. </>
      3 W& _& s6 i8 N2 q, o
    6. 7 F  l8 }; c$ g
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-17 19:38:27 | 显示全部楼层
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑 4 J" b+ d2 o) v$ W
    " g+ z& `( o& t8 x$ B7 }" y) \# c
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    " ^4 s1 g8 ]# w" p" h! L把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。1 Z* r5 R8 [9 g8 C8 Y# t& r7 o) A

      M- \- ]& ?% ?% `- w. @9 q4 f1 v* G  }( ?" Z/ l- a
    另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    发表于 2013-7-17 19:59:36 | 显示全部楼层
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑
    ) {9 o$ j- g' R, `, i) c; [
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    / u6 p$ l6 ^' O# v# ^' u4 t把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...( X/ i5 _4 ]. A9 m9 r7 i7 k
    sunsmile23 发表于 2013-7-17 19:38

    # ^2 H0 N& Y# c) {) h其实用正则表达式http://baike.baidu.com/view/94238.htm)只多了一步而已。数据是.xls还是.txt,本质上都是一样的,前者有tab而已,txt间隔合适的话可以直接导入Excel。我其实一般都是新建一列(或多列,插入位置看情况,最后一列一般是</>),然后把Excel的内容复制(懒得另存为txt)到文本编辑器(一般UE或者EditPlus),再把tab(以及其他标记性的内容)替换成空格或者换行之类的就OK了。
    1 P3 i, E% z! F$ a, T7 i  Fchigre的办法更高阶,一步就搞定了,用到了 (?<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 编辑
    : `4 r4 Q% S1 @' r
    $ J% l% Y& y6 n0 i7 Z7 a! ~为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。  M$ h$ E" G9 W3 o: r
    程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。
    ! `7 w* z5 C+ q. _1 w# U4 M5 s5 H" ^ADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main(), Z) J! C) v: {! S0 K
    2. Dim i As Integer2 H: u, S# h3 x1 _7 |6 G
    3. Dim sft As String
      ) n  O4 q0 a% i9 u) ~$ L8 B0 c& `
    4. Dim spy As String* ~8 a' ~4 B& U6 {$ S7 W$ I9 F
    5. Dim szm As String
      . F  R2 b! s/ I$ ?! P5 O
    6. Dim s As String
      . e# q/ k7 z) v9 F* X/ z/ M* [( X) }2 p
    7. Dim Stm As New ADODB.Stream8 H( A2 F- }! c" r0 m
    8. - i" K8 A; }) ]1 P! y) i
    9. Stm.Type = adTypeText
      9 U$ k; e- ~/ f- \
    10. Stm.Mode = adModeUnknown
      ! n, I! y& D* [6 A4 c9 L& m& n
    11. Stm.Open
      + |9 a7 \% |& Z
    12. Stm.Charset = "utf-8"
      ( A5 d3 v$ @* o

    13. % X! X) Y* Q1 t, _
    14. For i = 1 To 7
      0 `0 @0 @$ F$ u3 m
    15. sft = Cells(i, 1)
      ; d6 e; d, b& h6 f
    16. szm = Cells(i, 2)# d- a% ]4 l5 @, U1 W
    17. spy = Cells(i, 3)4 y$ J0 D7 b9 P6 ]$ S9 m% x
    18. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm* t( v6 M* i: Z( x. V8 Q, w. ?

    19. ) ^- K9 Z; w; ~( _& l
    20. Stm.WriteText s & vbLf( D! s+ O" r7 N' D9 w* U" A& D
    21. Next
      : ]* q6 k& e* J; h+ U- b# s

    22. 5 e( C% j' s: `  `) s+ f5 ~
    23. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"
      1 X: l" N# L/ |5 m: J
    24. Stm.SaveToFile "z:\vba.txt"
      8 i6 n; Z! y" `9 x
    25. Stm.Close
      " y( G0 Z( L# I  m# q
    26. End Sub& f  }* F! w2 W! _$ O/ I  R
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-20 15:18:51 | 显示全部楼层
    非常感谢!解决一个大问题!
    1 [7 d; \. n' N! D9 `  j4 m4 O6 S4 z- i
    works perfectly!
  • TA的每日心情
    开心
    11 小时前
  • 签到天数: 2242 天

    [LV.Master]伴坛终老

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

    该用户从未签到

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

    本版积分规则

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

    GMT+8, 2025-4-4 19:37 , Processed in 0.027228 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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