掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 5479|回复: 17

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

[复制链接]

该用户从未签到

发表于 2013-7-17 11:23:21 | 显示全部楼层 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。2 ]4 J3 O; I9 b7 D" Y9 F& y
加上vba,就更是如虎添翼,是词典制作的好帮手。4 x9 j. h2 ]" A' p
不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。
! A2 Y8 Y; k$ o( b" n& k" X2 H/ C# ?* A2 K& t$ C: ?, N' v
Excel文件:
! v! M1 Y: p" t; J: Q

本帖子中包含更多资源

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

x

评分

1

查看全部评分

本帖被以下淘专辑推荐:

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

    [LV.Master]伴坛终老

    发表于 2013-7-17 11:36:32 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑
    7 t0 Y! T2 r: z- V9 I" |
    : u$ l( N: m9 P. \$ j/ u: J* yhttp://blog.sina.com.cn/s/blog_40350cc7010006ch.html
    ( ]1 n" E; K- S# j1 \http://www.phpfans.net/article/htmls/201104/MzM2NzM0.html
      |! M( Y# u$ g0 l0 h8 ^5 G  Whttp://www.idiandian.com/communi ... 9b58d8db/page1.html
    : N" L' N% K+ C楼主又准备制作什么经典字典?{:soso_e179:}
    6 D1 `2 s1 w9 c' o有什么问题,可以先baidu再google

    该用户从未签到

     楼主| 发表于 2013-7-17 12:51:51 | 显示全部楼层
    非常感谢您的回复。' ~, q; i1 v# u; C3 N: w; R
    不过那些方法也试过,不行。, F3 p" M) K6 l' b; M' {# {- H
    您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2263 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 13:02:19 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 13:07 编辑 3 J+ @+ k% h* B) S1 e3 s( ?
    $ W( @$ e# c1 [0 y! P! \
    再尝试这个:
    2 x1 u1 I4 U- _# T# P3 `http://stackoverflow.com/questio ... vba-export-to-utf-8: p9 ], Q/ c6 G! k* ?+ ^
    http://www.knowexcel.com/view/66 ... -file-with-vba.html  ?% g" ?4 v0 S1 j" j% i# A
    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 | 显示全部楼层
    感谢老大出面。
    9 B+ i* g) Q+ j: G: J6 r2 ^
    ! l" v2 t0 j8 ]0 ], o我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。
    ) v/ V/ m0 x) W9 D/ A; ?
    9 J2 R4 e$ z% X; z6 k, ]" V, K/ v" O0 K现在的情况主要是:4 |+ G9 H7 z) A- J9 t' `
    单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。  l, z' }4 z, }/ E8 t2 P
    就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2263 天

    [LV.Master]伴坛终老

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

    该用户从未签到

     楼主| 发表于 2013-7-17 17:48:25 | 显示全部楼层
    你不明白我的需求。excel 整体存取,什么编码都没有问题。3 G0 f- }+ R: F
    ) E' e! \1 L/ Q
    而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。
    2 t8 y! h4 w: C8 [: b- {例如,我有数据:
    2 z1 t* C. ^$ K. z% W. H列:A列 B列 C列) l' R1 M' ~8 ~2 u' V# M$ Y
    数据:a b c* ~9 D" z; F/ Q
    上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:
    " S1 [, |/ h3 @# d/ Pa# B# B! W8 Y. t6 I
    a+c+<a href=.........b.......</a>0 }3 J! K) K* Q# X. E, {
    </>
    # @8 c9 z0 F1 B/ Z+ I+ Z" z% \+ D总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。3 u" N1 e# K- g- p1 d
    网上找的办法也不行。
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2263 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 18:27:10 | 显示全部楼层
    http://d.hatena.ne.jp/niemands/20090316/1237225383) ~' h& g& m' v% p
    再看一个日的

    该用户从未签到

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

    1. 0 u* E0 @3 n+ o6 n7 ^- G

    2. $ g9 E) [1 s. V0 `
    3. A        B        C
      4 k2 D1 G! d2 b8 K0 z

    4. 6 u* _- h4 D) O/ x( ^- E* c
    复制代码
    可以直接使用正则替代啊:
    " L6 l- X1 O, r% w! w\r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n% C4 T) X  A' @% g9 o; W$ o
    替代为:( |# v$ s/ ]8 C  b- u  C3 Q: l, W
    \r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n
      F! m1 T3 f* i, [" D
    . Z, o- m( y6 i+ E9 ?) ?4 J% j就会成为:

    1. ) p3 ]# a! T7 Y) R' p) F' L
    2. * v+ O  I8 s6 i# g% T
    3. A
        p+ I) @6 b2 J& a
    4. A B <a href="entry://C">4 I; {) Y4 X# b, P+ L6 u
    5. </>- ^" J% g  H. `# O
    6. , v' L$ r% a' _6 l$ U  y
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-17 19:38:27 | 显示全部楼层
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑 ) e6 W" O- X5 u8 g: Q! A2 A2 c" r' s
    3 I5 y, M0 h$ b
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    ( y: F, i5 Z6 N) x: x把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。8 L! N- j/ }$ M: y

    * ~1 [$ A# J' Z- Y
    8 h9 v* r( A, r8 l另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    发表于 2013-7-17 19:59:36 | 显示全部楼层
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑 2 Z* n2 t5 k5 D8 D% O# m% @# ]. m8 ^
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    ( I; @7 W2 R8 @* @2 l6 w把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...# u' p8 \; Z# Y9 ^3 l! ]7 A! T4 N9 Z0 |
    sunsmile23 发表于 2013-7-17 19:38
    ) a5 Z$ j+ @% n% _+ v3 f
    其实用正则表达式http://baike.baidu.com/view/94238.htm)只多了一步而已。数据是.xls还是.txt,本质上都是一样的,前者有tab而已,txt间隔合适的话可以直接导入Excel。我其实一般都是新建一列(或多列,插入位置看情况,最后一列一般是</>),然后把Excel的内容复制(懒得另存为txt)到文本编辑器(一般UE或者EditPlus),再把tab(以及其他标记性的内容)替换成空格或者换行之类的就OK了。
    0 X3 G6 ^# J: U# S$ @) B9 N( 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 编辑
    . ?, S& }- n8 r( ]9 V. N; t9 K" S8 R  z& V4 ^& I. l" f( |8 J
    为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。4 }" U$ k. g3 \  h' {
    程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。9 l5 G6 X/ q1 D+ m% q9 d
    ADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main()
      : A) W' f& E9 s! t
    2. Dim i As Integer
      2 i0 e# E: a' `" V
    3. Dim sft As String
      ( |8 [/ r% p  t. {% t
    4. Dim spy As String
      6 c/ W6 J$ C) A
    5. Dim szm As String
      , q* I) F! k) C1 V/ r1 x
    6. Dim s As String$ }  Q2 M! O6 r
    7. Dim Stm As New ADODB.Stream
      * f* q3 j" Z$ z% L7 u
    8. $ ]5 e- @! |, b6 k' z+ A
    9. Stm.Type = adTypeText3 D- S$ G; i$ o+ T* Y
    10. Stm.Mode = adModeUnknown
      ; o% [, \* j3 G" x% j: p
    11. Stm.Open
      7 ^* [" n5 Q% V5 U% R8 m5 l
    12. Stm.Charset = "utf-8"2 o- u6 ], K  ?7 r" ^% T$ u1 _

    13. / B  j8 N  c  h$ G8 }. t
    14. For i = 1 To 7' d8 c6 W3 z) M9 E) v: t
    15. sft = Cells(i, 1)
      1 U5 T4 P: C1 Z0 H" z
    16. szm = Cells(i, 2)
      0 {  Q- }7 V- O4 V
    17. spy = Cells(i, 3)
      $ F) P% l  |" R3 s+ r9 n
    18. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm
      5 P; X* a# e6 t, G

    19. - _* j: K$ |4 ~! r7 Y7 p1 |
    20. Stm.WriteText s & vbLf  U' P$ Q" `  j; |9 j( d7 d
    21. Next
      ( F9 o& V! `$ r, s+ n: G$ _5 p

    22. : C5 n% l- P& [; Z3 o% T
    23. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"
      ) ^! z3 ?/ z1 a6 c# J7 o5 F& D, M2 y/ P
    24. Stm.SaveToFile "z:\vba.txt"
      0 L1 b7 z" D8 u$ }
    25. Stm.Close
      ( v& a' k) m: Y) v, ~8 @% y
    26. End Sub
        b1 [) s8 z0 L1 P2 B' E2 P* ^, S- @
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-20 15:18:51 | 显示全部楼层
    非常感谢!解决一个大问题!, y- r( J4 q, T6 z  j$ x

    ( x7 s6 ?6 K3 Yworks perfectly!
  • TA的每日心情
    开心
    5 小时前
  • 签到天数: 2263 天

    [LV.Master]伴坛终老

    发表于 2013-7-20 20:21:52 | 显示全部楼层
    我也准备说了,想不到已经有人回答。对实现不行,就用vba调用win32 api。基本啥都能干。
    3 @6 L3 {4 s+ q" i/ J% [) s7 z而且vbs调用vba再操作win32 api,这样处理就更强。不用等把所有文件内容显示完再处理...

    该用户从未签到

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

    本版积分规则

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

    GMT+8, 2025-4-25 13:59 , Processed in 0.024616 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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