使用VBScript创建MS Word文件时的编码问题

时间:2015-02-15 14:33:34

标签: vbscript ms-word ms-office

我正在尝试在VBScript中编写一个脚本,它应该打开Microsoft Word并写下一些文本。 只要我写的文字是英文的,脚本就会按预期工作。 但是,当文本是希伯来语或中文时,我只能在MS Word中获得胡言乱语。

我尝试将脚本文件保存为UTF-8,但在此更改后我无法再运行它。 我也尝试包装它,因此它将是一个wsf脚本,它也没有用。 在Google上找不到任何其他建议。

这是剧本(这次我试图用希伯来文写下“שלום”这个词。)

Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set fso = CreateObject("Scripting.FileSystemObject")
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.TypeText "שלום"

当我运行这个脚本时,它打开MS字并写下“ùìåí”而不是“שלום”。

1 个答案:

答案 0 :(得分:1)

您可以使用以下编码保存脚本文件:

  1. ANSI。只能使用256个字符:0..127是标准ASCII,上部取决于您在系统设置中选择的区域设置,或者被SetLocale()覆盖。
  2. Unicode(UCS-2或UTF-16,Little Endian)。如果使用BOM保存或没有BOM,则可以使用它。有1 112 064个可用字符。在我看来,这是让你的脚本工作的最简单方法。但文件大小增加了2倍。
  3. UTF-8。对Unicode代码空间中的任何符号进行编码。只有在没有BOM的情况下保存脚本才能运行脚本。
  4. UTF-8作为.wsf文件,第一个标记为<?XML version="1.0" encoding="UTF-8"?>
  5. ANSI,但是将所有字符串都设置为WScript.Echo ChrW(1513) & ChrW(1500) & ChrW(1493) & ChrW(1501)
  6. Notepad ++和Notepad2可以清楚地设置必要的编码。

    关于第3项。通常,Windows脚本宿主无法以带有BOM的UTF-8编码运行脚本文件,并且将文件的每个字节识别为没有BOM作为ANSI编码的字符,同时将文件下载到记忆。我可以建议一个解决方法,允许纠正错误识别的字符包含在变量中,但是你知道,Unicode是一种更好的方法。这是一个例子:

    s = "שלום"
    WScript.Echo s ' wrong encoding
    r = FixChars(s)
    WScript.Echo r ' שלום
    
    Function FixChars(s)
        Dim r, p
        r = ""
        For p = 1 To Len(s)
            r = r & ChrB(Asc(Mid(s, p, 1)))
        Next
        With CreateObject("ADODB.Stream")
            .Type = 2
            .Mode = 3
            .Charset = "Unicode" ' HKLM\SOFTWARE\Classes\MIME\Database\Charset
            .Open
            .WriteText r
            .Position = 0
            .Charset = "UTF-8"
            r = .ReadText
            .Close
        End With
        Do While LeftB(r, 2) = ChrB(&HFD) & ChrB(&HFF)
            r = MidB(r, 3)
        Loop
        FixChars = r
    End Function
    

    您不应该通过SetLocale()从脚本开始直到FixChars()完成更改语言环境,否则会出错。

    以下代码就是一个示例第4项:

    <?XML version="1.0" encoding="UTF-8"?>
    <job>
    <script language="VBScript">
    <![CDATA[
    WScript.Echo "שלום"
    ]]>
    </script>
    </job>