使用 VBScript 创建 MS Word 文件时出现编码问题
Encoding issue when creating MS Word file using VBScript
我正在尝试用 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 并写下“ùìåí”而不是“שלום”。
您可以使用以下编码保存脚本文件:
- 美国标准。只能使用 256 个字符:0..127 是标准 ASCII,上半部分取决于您在系统设置中选择的语言环境,或者被
SetLocale()
. 覆盖
- Unicode(UCS-2 或 UTF-16,Little Endian)。如果保存有 BOM,或没有 BOM,它都有效。有 1 112 064 个可用字符。在我看来,这是让脚本正常工作的最简单方法。但是文件大小增加了 2 倍。
- UTF-8。以 Unicode 代码 space 编码任何符号。只有在没有 BOM 的情况下保存脚本才能 运行。
- UTF-8 作为
.wsf
文件,第一个标签 <?XML version="1.0" encoding="UTF-8"?>
- ANSI,但将所有字符串都放在
WScript.Echo ChrW(1513) & ChrW(1500) & ChrW(1493) & ChrW(1501)
.
Notepad++ 和 Notepad2 很方便,可以清楚地设置必要的编码。
关于第3项。一般情况下,Windows Script Host无法运行脚本文件以UTF-8编码带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>
我正在尝试用 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 并写下“ùìåí”而不是“שלום”。
您可以使用以下编码保存脚本文件:
- 美国标准。只能使用 256 个字符:0..127 是标准 ASCII,上半部分取决于您在系统设置中选择的语言环境,或者被
SetLocale()
. 覆盖
- Unicode(UCS-2 或 UTF-16,Little Endian)。如果保存有 BOM,或没有 BOM,它都有效。有 1 112 064 个可用字符。在我看来,这是让脚本正常工作的最简单方法。但是文件大小增加了 2 倍。
- UTF-8。以 Unicode 代码 space 编码任何符号。只有在没有 BOM 的情况下保存脚本才能 运行。
- UTF-8 作为
.wsf
文件,第一个标签<?XML version="1.0" encoding="UTF-8"?>
- ANSI,但将所有字符串都放在
WScript.Echo ChrW(1513) & ChrW(1500) & ChrW(1493) & ChrW(1501)
.
Notepad++ 和 Notepad2 很方便,可以清楚地设置必要的编码。
关于第3项。一般情况下,Windows Script Host无法运行脚本文件以UTF-8编码带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>