掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 5523|回复: 17

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

[复制链接]

该用户从未签到

发表于 2013-7-17 11:23:21 | 显示全部楼层 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。
2 n8 t0 F+ _7 I加上vba,就更是如虎添翼,是词典制作的好帮手。
; m% V4 F5 Y& ?; j不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。
$ G: a. C* t2 p7 W2 O/ L4 s$ m  Z
5 m3 W' P; Z  a' v6 nExcel文件:/ j+ t1 G4 A, {# ]# a( x

本帖子中包含更多资源

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

x

评分

1

查看全部评分

本帖被以下淘专辑推荐:

  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 2269 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 11:36:32 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑
    - s" p7 Y3 V! E( n. e0 Y/ J7 ~. I0 V/ e# i2 a* k3 B* h/ H+ c+ _9 H& }7 \
    http://blog.sina.com.cn/s/blog_40350cc7010006ch.html3 e" M: w( g4 H( c9 w  J
    http://www.phpfans.net/article/htmls/201104/MzM2NzM0.html& F. C. g0 |$ z% h  j
    http://www.idiandian.com/communi ... 9b58d8db/page1.html, g: A' ?1 Z8 f. }
    楼主又准备制作什么经典字典?{:soso_e179:}
    ; e3 U  Y' V2 `( ]0 u有什么问题,可以先baidu再google

    该用户从未签到

     楼主| 发表于 2013-7-17 12:51:51 | 显示全部楼层
    非常感谢您的回复。
    . x4 j$ j+ A6 s( m) V3 Y( X* F不过那些方法也试过,不行。
    ' P6 t) O% J: h6 |) ?您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 2269 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 13:02:19 | 显示全部楼层
    本帖最后由 peterdocter 于 2013-7-17 13:07 编辑 9 F& [# S4 i/ f& i

    6 k5 l8 d) r9 I4 F0 J再尝试这个: , `* X' m2 M, w  ]: n5 _2 Z1 W
    http://stackoverflow.com/questio ... vba-export-to-utf-8
    ( m* M9 }; j/ n3 Ihttp://www.knowexcel.com/view/66 ... -file-with-vba.html
    0 O2 ]% U9 ~7 j% e/ whttp://club.excelhome.net/thread-513237-1-1.html

    该用户从未签到

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

    该用户从未签到

     楼主| 发表于 2013-7-17 15:51:25 | 显示全部楼层
    感谢老大出面。0 G) N5 Y+ T% t" e5 F) K! }
    & q6 U& {( _1 K" b: j, c% F9 L  ~6 x
    我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。
    , a. ~2 v4 J( f; S1 @4 A% d( P0 e% t$ w
    现在的情况主要是:
    1 D4 n$ t; B9 _+ K+ M" ^单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。' {- ?1 n$ k5 R, p; t) y. z
    就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 2269 天

    [LV.Master]伴坛终老

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

    该用户从未签到

     楼主| 发表于 2013-7-17 17:48:25 | 显示全部楼层
    你不明白我的需求。excel 整体存取,什么编码都没有问题。" {% W1 O1 t& R; e7 E

    . U6 B3 n% s8 B, @而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。
    " }1 z5 r0 G( l例如,我有数据:
    ( A2 \; l  X/ S7 g9 m0 F列:A列 B列 C列! `& L) l2 Q0 ?
    数据:a b c  C6 y2 ?1 @1 L! M
    上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:: B( Q7 `$ v2 i9 S; T
    a
    ( F9 B. z9 h, \8 J# da+c+<a href=.........b.......</a>
    ; Z( O2 S1 x: `: K8 r* _</>
    , P9 F) _! E9 D0 \4 Q总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。
    + V( m) Y% f8 O# z. h* m网上找的办法也不行。
  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 2269 天

    [LV.Master]伴坛终老

    发表于 2013-7-17 18:27:10 | 显示全部楼层
    http://d.hatena.ne.jp/niemands/20090316/1237225383
      @" l5 c% G9 e& F再看一个日的

    该用户从未签到

    发表于 2013-7-17 19:17:29 | 显示全部楼层
    1.   r( b! f3 }3 y- l. |
    2. - P; }# p5 F: j2 _7 ?' A0 k9 J
    3. A        B        C8 P# K, t1 t" N' `. {7 _- @
    4. : ]/ R8 [" A$ W/ {; q8 n5 ]+ e/ A
    复制代码
    可以直接使用正则替代啊:& ?% R3 u" C; g7 ~) u6 Y# {  {
    \r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n/ a. {! Y" Y+ U# D% s1 p; w- ~
    替代为:/ s$ n% W- ~5 n5 m
    \r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n* j0 F0 V6 l' \  I) r/ W

    / T( I0 w: s% C! H& p; t& s, S就会成为:
    1. 9 y4 v. a0 }! ^' R

    2. 0 D8 p0 w+ ^' [/ S  @. T+ a- t
    3. A, J( W% G  Z4 X
    4. A B <a href="entry://C">+ X7 y- o9 F3 I! T
    5. </>
      % i1 L8 G( e3 o# z6 r

    6. . k5 {+ C3 z) C
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-17 19:38:27 | 显示全部楼层
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑 : t+ g7 k  ]$ C. C

    $ q5 H- ?& H# k6 U- ?: \6 h; e这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    . b% z* `3 o  Q9 I2 I1 O- j) T把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。# d/ X3 g' ~# P. X0 a- N3 \
    * v) H' C1 ]; e+ t2 D% g' u. V

    " Z; t' u. N+ Y9 }另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    发表于 2013-7-17 19:59:36 | 显示全部楼层
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑 : e: C5 i/ k5 {1 q3 h) P4 @
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    5 ]; n  H; g9 K* W% b把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...- g# J3 C! J- V
    sunsmile23 发表于 2013-7-17 19:38
    * p2 }- K/ @1 _0 [2 A. l5 k
    其实用正则表达式http://baike.baidu.com/view/94238.htm)只多了一步而已。数据是.xls还是.txt,本质上都是一样的,前者有tab而已,txt间隔合适的话可以直接导入Excel。我其实一般都是新建一列(或多列,插入位置看情况,最后一列一般是</>),然后把Excel的内容复制(懒得另存为txt)到文本编辑器(一般UE或者EditPlus),再把tab(以及其他标记性的内容)替换成空格或者换行之类的就OK了。
    / Q6 @, x5 x4 U) b# T, Tchigre的办法更高阶,一步就搞定了,用到了 (?<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 C7 _3 D! c! r' W) R+ `* B: ]5 Y7 \" G3 g) f) O
    为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。
    0 }' X2 x4 u, N9 S7 R程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。
    : a  N* k" d) C/ i& M! }) u$ DADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main()9 |9 t2 M3 L0 j1 r
    2. Dim i As Integer
      : T1 ~: x. a% y. E0 ?
    3. Dim sft As String
      3 K2 {7 n; r; M6 E* P
    4. Dim spy As String
        A# }& _& g- a' `  `  U* o7 c. D
    5. Dim szm As String3 S! C% P6 M. `
    6. Dim s As String, }! e" t1 ^' J2 o( z. }
    7. Dim Stm As New ADODB.Stream
      ) b5 i2 C/ ]# o3 Z  f* k8 w, K9 y
    8. 2 P7 g: P! P. |
    9. Stm.Type = adTypeText
      / o3 e+ m  x' _: v! J% Z- M, J' m4 R
    10. Stm.Mode = adModeUnknown6 i8 h# l9 _1 Y1 E/ x
    11. Stm.Open
      ( T" M# |7 k: l
    12. Stm.Charset = "utf-8"' l( M7 H$ d6 R. k# J( t
    13. ; [+ ~: m' B1 v' g
    14. For i = 1 To 7
      " ?% t0 ^- j" U3 u$ b
    15. sft = Cells(i, 1)
      9 o" K2 J/ b6 z% L
    16. szm = Cells(i, 2)! x* f3 N* N# m0 j/ U
    17. spy = Cells(i, 3)
      , D  I% o) U3 I0 b( R
    18. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm
      0 @& F/ [5 x5 W" V& M+ E8 w
    19. 5 v6 C( L, w6 I; r/ ^1 _
    20. Stm.WriteText s & vbLf
      9 j3 I( M- T/ D: U! s* ~
    21. Next
      ) b  i- O2 D" L+ c

    22. . d2 G5 A  Z0 H+ l/ N: X0 h
    23. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"5 T. T# Z; b+ i
    24. Stm.SaveToFile "z:\vba.txt"
      4 w1 I# q4 V$ K) C6 d  W7 S( D/ ^
    25. Stm.Close
      % Y$ F. ^3 X4 q. ]( }: Q
    26. End Sub0 ^: D3 i1 ^* ~+ G3 L, ^
    复制代码

    该用户从未签到

     楼主| 发表于 2013-7-20 15:18:51 | 显示全部楼层
    非常感谢!解决一个大问题!( i5 y% T/ b) [0 O6 S
    6 Y) G4 x! v+ K. {  c
    works perfectly!
  • TA的每日心情
    开心
    19 分钟前
  • 签到天数: 2269 天

    [LV.Master]伴坛终老

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

    该用户从未签到

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

    本版积分规则

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

    GMT+8, 2025-5-2 08:19 , Processed in 0.025630 second(s), 27 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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