掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 4862|回复: 17

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

[复制链接]

该用户从未签到

发表于 2013-7-17 11:23:21 | 显示全部楼层 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。4 l6 U" ~- U/ q5 A7 M: B
加上vba,就更是如虎添翼,是词典制作的好帮手。2 y6 n5 ~9 ^. i& p8 r% p& {$ \
不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。
% I  O8 _. Z) {# M+ Q2 [/ ~- ~; s2 D% W: G9 U
Excel文件:
/ b# B. e+ |/ I% F: E

本帖子中包含更多资源

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

x

评分

1

查看全部评分

本帖被以下淘专辑推荐:

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

    [LV.Master]伴坛终老

    发表于 2013-7-17 11:36:32 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑 6 B3 U9 l, P7 x( n

    0 y. y  v1 r  R0 C6 p" w2 U8 b' yhttp://blog.sina.com.cn/s/blog_40350cc7010006ch.html
    # Y( D$ D& k& O" p& H" @http://www.phpfans.net/article/htmls/201104/MzM2NzM0.html
    " X) P) _; K2 A: m; q+ w! qhttp://www.idiandian.com/communi ... 9b58d8db/page1.html: H2 E8 s' _$ K" U
    楼主又准备制作什么经典字典?{:soso_e179:}
    % `- O) T' {/ [9 f) N" S有什么问题,可以先baidu再google

    该用户从未签到

     楼主| 发表于 2013-7-17 12:51:51 | 显示全部楼层
    非常感谢您的回复。6 Y+ y$ N; x5 Q5 @2 @" @9 H2 r: y
    不过那些方法也试过,不行。$ D6 J' ?" g! t4 N* y1 Z
    您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1887 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 13:02:19 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 13:07 编辑 8 u. {, M* ]# L" Q
    , _7 l$ @6 F. Q
    再尝试这个:
    6 W% S3 o3 t; ^4 E- phttp://stackoverflow.com/questio ... vba-export-to-utf-8
    - p5 D5 t' _% h7 _http://www.knowexcel.com/view/66 ... -file-with-vba.html
    9 v# C' E' ], f4 L2 W8 Ghttp://club.excelhome.net/thread-513237-1-1.html

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2013-7-17 15:51:25 | 显示全部楼层
    感谢老大出面。& s; H9 t5 @  S4 `# f% j$ l6 u
    * f, f/ a- A9 h2 _! d0 j, d
    我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。
    $ G3 H7 U) H# O% c# c: u/ d/ M+ q! _
    现在的情况主要是:
    : o' ]2 W, H8 Q+ ?" B单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。
    * X2 t1 U5 Y4 R" _4 S就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1887 天

    [LV.Master]伴坛终老

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

    该用户从未签到

     楼主| 发表于 2013-7-17 17:48:25 | 显示全部楼层
    你不明白我的需求。excel 整体存取,什么编码都没有问题。
    ) S' j8 F9 ~$ e2 U1 K2 i6 h7 ]5 u! ?9 Q3 f4 c; [. w, g
    而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。7 R2 T1 `; [) f' |
    例如,我有数据:
    5 j9 P8 r6 C6 g1 G) f! T列:A列 B列 C列% K: a) s7 }4 C; m8 J4 s/ I7 w
    数据:a b c
    0 x: m3 L, |) n6 _- `5 k9 q上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:% ]( y' l; n& x- B6 P1 B9 m7 m
    a+ i& H/ c+ v) R9 i3 |2 w1 y/ }' _: u
    a+c+<a href=.........b.......</a>
    3 Q9 j6 b8 a# [3 ]  ^</>! R7 s6 `  M$ v& \" t+ `
    总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。+ q4 O  p9 q; I
    网上找的办法也不行。
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1887 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 18:27:10 | 显示全部楼层
    http://d.hatena.ne.jp/niemands/20090316/1237225383
    + i& d5 n) h+ S再看一个日的

    该用户从未签到

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

    1. , `. w+ X$ t: l7 v# T4 c9 ]5 {

    2. 9 [, F5 A1 U: E0 y
    3. A        B        C& q  w: r& ^$ \0 w; ?, v: `

    4. 4 F8 R7 `9 M) m' H5 f% X+ z
    复制代码
    可以直接使用正则替代啊:  z7 G7 g' `$ p+ N8 I; `& n
    \r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n3 p( i/ i. b% U7 s9 ?* k
    替代为:
    5 F3 k9 i; p/ n0 s+ d4 _0 l+ D% U\r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n
    4 Z; H$ V, e/ x) Y& M3 }% v& C4 K. v7 f0 E; c2 s$ R% h
    就会成为:

    1. ! P2 N2 F* O+ b/ K2 {0 c# E5 o% W: g

    2. $ g( u8 S+ r3 O- \' B( @
    3. A
      3 V  S) Q4 r8 ?: e
    4. A B <a href="entry://C">
      7 X& T. w$ c* s5 z* l: n/ ~
    5. </>
      5 N$ U! n/ f4 l  c4 i

    6. 1 r5 `$ i. W( \
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-17 19:38:27 | 显示全部楼层
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑
    # d( f) c- b8 P& f& a; F
    * R1 p$ E) @9 L! G5 ]$ x1 W/ a这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。, i# L1 T' C% r2 C$ ?! u" t
    把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。, Y9 C8 w' h5 s

    9 w3 Q* r# ~$ u% j5 i) z
    & z/ n- `6 C0 R: }' u8 K* \) C另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    发表于 2013-7-17 19:59:36 | 显示全部楼层
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑 3 W5 h) n. Z& q- t; A, V: r5 C
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
      b$ G9 k  M% }把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...; D: T, q7 L9 w* G& H0 a, n6 h
    sunsmile23 发表于 2013-7-17 19:38

    - d" K2 U3 A% I5 o1 L$ c其实用正则表达式http://baike.baidu.com/view/94238.htm)只多了一步而已。数据是.xls还是.txt,本质上都是一样的,前者有tab而已,txt间隔合适的话可以直接导入Excel。我其实一般都是新建一列(或多列,插入位置看情况,最后一列一般是</>),然后把Excel的内容复制(懒得另存为txt)到文本编辑器(一般UE或者EditPlus),再把tab(以及其他标记性的内容)替换成空格或者换行之类的就OK了。
    9 W: D3 y4 i) `3 T5 Uchigre的办法更高阶,一步就搞定了,用到了 (?<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 编辑
    ( r5 U3 a3 [2 k) ~- Q% r! {9 ^
    & `; I2 n, P. B为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。$ }& ~& j* `, @8 g' i5 E% Z
    程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。+ @3 c: T% H2 `& H) `. [
    ADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main()
      # M/ b( ?  I9 B* ~$ Y0 S
    2. Dim i As Integer
      $ A' y2 P7 j- C; ]+ V2 W
    3. Dim sft As String; N. j- |2 ?% M7 S
    4. Dim spy As String
      ( Q8 F! j- r* j  P
    5. Dim szm As String, C; u' d+ T% S3 Q
    6. Dim s As String
      8 f+ }9 Z; y1 I' i5 b
    7. Dim Stm As New ADODB.Stream& T7 N$ s9 u& T. c/ T8 w

    8. / V: J. C4 O& m8 C1 E
    9. Stm.Type = adTypeText$ E% r/ F) T1 y' }3 b8 C8 G  Q
    10. Stm.Mode = adModeUnknown
      ! b, \- B- V1 Z8 S: s
    11. Stm.Open+ p; B1 F  b4 C# Y; _( Z) Q4 b
    12. Stm.Charset = "utf-8"5 Y! M" Y1 R$ ^: N0 d2 N

    13. / w, C: u3 y5 q. j+ w' `% S  d5 z
    14. For i = 1 To 7
      ) o; N2 k+ m% q' ]  x4 V( R$ H" s
    15. sft = Cells(i, 1)1 ?( R, t& |2 Y( r& E7 O
    16. szm = Cells(i, 2)
      : @" ]' y5 e3 ], H$ s: ~
    17. spy = Cells(i, 3)
      7 U$ Y  v+ C, c- ^7 Z3 Q6 q
    18. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm
      + r# M  {3 w. w2 Z6 K

    19.   A! h: ]! t! J2 f2 B
    20. Stm.WriteText s & vbLf
      , S! R8 x% \, \
    21. Next
      % ~& o; u" k2 Y% s% ?( U$ s
    22. ) Y( s! c3 y7 _0 F$ i
    23. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"# w( A; X1 p3 [; i
    24. Stm.SaveToFile "z:\vba.txt"5 d( ^( y' n2 }: b6 e9 e1 p. m( r
    25. Stm.Close
      ! K. ?5 g! b1 l7 p' [  L/ \
    26. End Sub
      & T' p2 `9 l0 q8 H2 B" @
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-20 15:18:51 | 显示全部楼层
    非常感谢!解决一个大问题!
    $ a9 Y( Z  h  K! P  {
    9 ~8 `. r/ t- y2 k. @% P. }* u4 ?works perfectly!
  • TA的每日心情
    开心
    15 小时前
  • 签到天数: 1887 天

    [LV.Master]伴坛终老

    发表于 2013-7-20 20:21:52 | 显示全部楼层
    我也准备说了,想不到已经有人回答。对实现不行,就用vba调用win32 api。基本啥都能干。
    5 b, i) D8 M3 y/ J3 l; j3 `& x9 P( e而且vbs调用vba再操作win32 api,这样处理就更强。不用等把所有文件内容显示完再处理...

    该用户从未签到

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

    本版积分规则

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

    GMT+8, 2024-3-28 23:23 , Processed in 0.041082 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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