查看: 4462|回复: 17
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

14

主题

219

回帖

3817

积分

贡士

Rank: 6Rank: 6

积分
3817

灌水大神章小蜜蜂章笑傲江湖章

跳转到指定楼层
1
发表于 2013-7-17 11:23:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Excel 电子表格的处理能力很强,支持各种编码,处理百兆以上的大文件也没有问题,而且每个电脑都有安装,不需要特别的软件。
加上vba,就更是如虎添翼,是词典制作的好帮手。
不过我遇到一个拦路虎,就是怎么尝试也无法输出正确的UTF-8编码文件,下面附上我的文件,里面有尝试的说明,望有经验者不吝赐教,本人感激不尽。

Excel文件:
write2text.zip (11.81 KB, 下载次数: 32)

评分

1

查看全部评分

本帖被以下淘专辑推荐:

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

    [LV.Master]伴坛终老

    62

    主题

    2316

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29102

    灌水大神章小蜜蜂章笑傲江湖章

    2
    发表于 2013-7-17 11:36:32 | 只看该作者
    本帖最后由 peterdocter 于 2013-7-17 11:38 编辑

    http://blog.sina.com.cn/s/blog_40350cc7010006ch.html
    http://www.phpfans.net/article/htmls/201104/MzM2NzM0.html
    http://www.idiandian.com/communi ... 9b58d8db/page1.html
    楼主又准备制作什么经典字典?{:soso_e179:}
    有什么问题,可以先baidu再google

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    3
     楼主| 发表于 2013-7-17 12:51:51 | 只看该作者
    非常感谢您的回复。
    不过那些方法也试过,不行。
    您可以看看那个附件,其实也很简单,结果就是不行。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1537 天

    [LV.Master]伴坛终老

    62

    主题

    2316

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29102

    灌水大神章小蜜蜂章笑傲江湖章

    4
    发表于 2013-7-17 13:02:19 | 只看该作者

    该用户从未签到

    45

    主题

    1420

    回帖

    1万

    积分

    管理员

    Rank: 13Rank: 13Rank: 13Rank: 13

    积分
    10971

    管理组专用章

    5
    发表于 2013-7-17 14:38:03 | 只看该作者
    实在不行就先输出utf-16, 然后再找工具转成utf-8...

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    6
     楼主| 发表于 2013-7-17 15:51:25 | 只看该作者
    感谢老大出面。

    我主要是想把单元格输出为mdict可编译的格式。这样可以一次成型,免得转弯抹角,浪费时间。

    现在的情况主要是:
    单独的单元格输出为UTF-8正常,但是单元格字符串前后加点东西,比如说超链接之类,再加点其他的汉字,就成乱码。不转换还不成,vba执行会受阻。
    就是例子中单元格5所遇到的情况。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1537 天

    [LV.Master]伴坛终老

    62

    主题

    2316

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29102

    灌水大神章小蜜蜂章笑傲江湖章

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

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    8
     楼主| 发表于 2013-7-17 17:48:25 | 只看该作者
    你不明白我的需求。excel 整体存取,什么编码都没有问题。

    而我要直接处理单元格,直接输出maxbuilder格式的文本。何必在各种软件中换来换去,查找来替换去。
    例如,我有数据:
    列:A列 B列 C列
    数据:a b c
    上面是excel 单元格数据,我或许要经过一些变换或处理,直接输出为maxbuilder可编译的格式,如或许是这样:
    a
    a+c+<a href=.........b.......</a>
    </>
    总之,我现在的主要问题是,若单元格中没有什么特殊点的字符,啥问题都没有。gb2312就行了。但是,若单元格中有比较特殊的字符,例如第5单元格,fso写入就要出错。转成UTF-8就行了。但单独写行,前后加点东西就不行。
    网上找的办法也不行。
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1537 天

    [LV.Master]伴坛终老

    62

    主题

    2316

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29102

    灌水大神章小蜜蜂章笑傲江湖章

    9
    发表于 2013-7-17 18:27:10 | 只看该作者

    该用户从未签到

    26

    主题

    418

    回帖

    3370

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3370

    灌水大神章小蜜蜂章笑傲江湖章

    10
    发表于 2013-7-17 19:17:29 | 只看该作者


    1. A        B        C

    复制代码
    可以直接使用正则替代啊:
    \r\n(?<sub>.*?)        (?<sub>.*?)        (?<sub>.*?)\r\n
    替代为:
    \r\n\1\r\n\1 \2 <a href="entry://\3">\r\n</>\r\n

    就会成为:


    1. A
    2. A B <a href="entry://C">
    3. </>

    复制代码

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    11
     楼主| 发表于 2013-7-17 19:38:27 | 只看该作者
    本帖最后由 sunsmile23 于 2013-7-17 19:48 编辑

    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工而且修改方便,多方便。


    另:请问,您这是在哪儿替换?是在单元格中替换吗?

    该用户从未签到

    2121

    主题

    2961

    回帖

    6万

    积分

    翰林院修撰

    不忘初心。送分大人,灌水砖家。擅长抛砖引玉,挖坑不填。

    Rank: 12Rank: 12Rank: 12

    积分
    61056

    翰林院专用章灌水大神章笑傲江湖章小蜜蜂章管理组专用章

    12
    发表于 2013-7-17 19:59:36 | 只看该作者
    本帖最后由 Oeasy 于 2013-7-17 20:12 编辑
    这个是行,但是我的数据是 excel 保存,把他另存为文本文件,再来查找替换,多别扭。excel单元格,支持换行符又不方便。
    把excel数据直接变为最终可编译格式的文本文件,一次成型,不用任何查找替换,关键是省了人工 ...
    sunsmile23 发表于 2013-7-17 19:38

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

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    13
     楼主| 发表于 2013-7-17 20:15:11 | 只看该作者
    赞!真高手,炉火纯青!

    该用户从未签到

    7

    主题

    81

    回帖

    2460

    积分

    解元

    Rank: 5Rank: 5

    积分
    2460

    灌水大神章小蜜蜂章笑傲江湖章

    14
    发表于 2013-7-20 10:58:44 | 只看该作者
    本帖最后由 i-wiki 于 2013-7-20 20:04 编辑

    为什么要使用FSO?VBA有自己的文件处理语句,可以对文本或二进制数据操作,结合kernel32函数调用可完成Unicode到utf8代码转换。
    程序中疑似函数tran_ado转换时,从流中读出并返回串时有问题。
    ADODB的Stream本身就可以保存为文件,试一试下面代码如何?
    1. Sub main()
    2. Dim i As Integer
    3. Dim sft As String
    4. Dim spy As String
    5. Dim szm As String
    6. Dim s As String
    7. Dim Stm As New ADODB.Stream

    8. Stm.Type = adTypeText
    9. Stm.Mode = adModeUnknown
    10. Stm.Open
    11. Stm.Charset = "utf-8"

    12. For i = 1 To 7
    13. sft = Cells(i, 1)
    14. szm = Cells(i, 2)
    15. spy = Cells(i, 3)
    16. s = "<a href=""entry://" & sft & "/"">" & sft & "</a>" & spy & "/" & szm

    17. Stm.WriteText s & vbLf
    18. Next

    19. If Dir("z:\vba.txt") <> "" Then Kill "z:\vba.txt"
    20. Stm.SaveToFile "z:\vba.txt"
    21. Stm.Close
    22. End Sub
    复制代码

    该用户从未签到

    14

    主题

    219

    回帖

    3817

    积分

    贡士

    Rank: 6Rank: 6

    积分
    3817

    灌水大神章小蜜蜂章笑傲江湖章

    15
     楼主| 发表于 2013-7-20 15:18:51 | 只看该作者
    非常感谢!解决一个大问题!

    works perfectly!
  • TA的每日心情
    开心
    昨天 08:00
  • 签到天数: 1537 天

    [LV.Master]伴坛终老

    62

    主题

    2316

    回帖

    2万

    积分

    状元

    Rank: 9Rank: 9Rank: 9

    积分
    29102

    灌水大神章小蜜蜂章笑傲江湖章

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

    该用户从未签到

    11

    主题

    243

    回帖

    472

    积分

    禁止发言

    积分
    472
    17
    发表于 2013-11-24 17:53:14 | 只看该作者
    学习了