【问题标题】:Encoding issue when creating MS Word file using VBScript使用 VBScript 创建 MS Word 文件时的编码问题
【发布时间】:2015-03-28 04:05:39
【问题描述】:

我正在尝试用 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 word 并写下“ùìåí”而不是“שלום”。

【问题讨论】:

    标签: vbscript ms-word ms-office


    【解决方案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)

    Notepad++ 和 Notepad2 可以方便地明确设置必要的编码。

    关于第 3 项,Windows Script Host 通常无法运行带 BOM 的 UTF-8 编码的脚本文件,并将不带 BOM 的 UTF-8 编码文件的每个字节识别为 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>
    

    【讨论】:

    • UTF-16LE 解决了我的问题。非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多