【问题标题】:Append vbCrLF to UCS-2 Little Endian将 vbCrLF 附加到 UCS-2 Little Endian
【发布时间】:2016-07-09 05:15:37
【问题描述】:

我正在通过 HP-UFT(前 QTP)使用 vbscript。 我面临的问题看起来很简单,但我无法解决。

我有从某个系统导出的 .CSV 文件,并且此文件中没有完成的 CRLF。

我需要一个简单的修复来追加新行到这个文件(我知道这可能是写入另一个文件的解决方法) 我正在使用这样的 FileSystemObject:

Set objFile = objFSO.OpenTextFile(outFile,8)' (outFile,8, true/false/default)
objFile.Write "test string" & vbCrLf ' and other different combinations

我没有使用 ADODB.Stream 因为它没有附加功能,我不需要额外的文件

当我尝试后在记事本中打开文件时,我看到的是空方块而不是 CRLF。我认为这是因为使用 UCS-2 Little Endian 编码创建的文件。我对 utf-8 没有这样的问题

PS 也许可以更快速地修复系统变量?我在网络中发现可以通过一些系统变量更改所有创建文件的默认编码,但找不到它的名称。 我在地区和语言中的语言 -> 管理 -> 非 Unicode 的语言是英语

【问题讨论】:

  • “没有使用ADODB.Stream,因为它没有附加功能”,是这样吗?你叫什么Write(),只需先使用Position 属性移动到EOS
  • 您不能使用 vbCrLf,因为 VBScript 不是 UCS-2,因此当您真正需要 0D00 0A00 时会产生 0D0A Carriage Return LineFeed
  • 读入文本文件,追加文本,在现有文件上写入新文本。
  • Microsoft 将这两个术语(UCS-2 和 UTF-16)用于相同的编码。从技术上讲,它可能并不完全正确,但它足够接近,因此在这种情况下差异并不重要。 [Wikipedia]

标签: csv vbscript qtp hp-uft


【解决方案1】:

如有疑问,请阅读documentation

语法

object.OpenTextFile(filename[, iomode[, create[, format]]])

参数

[...]
格式
可选的。三个 Tristate 值之一,用于指示打开文件的格式(TristateTrue = -1 以 Unicode 格式打开文件,TristateFalse = 0以 ASCII 格式打开文件,TristateUseDefault = -2 以系统默认值打开文件)。如果省略,则文件以 ASCII 格式打开。

您打开文件进行追加,但未指定编码,因此解释器采用 ASCII 格式。换行

Set objFile = objFSO.OpenTextFile(outFile,8)

Set objFile = objFSO.OpenTextFile(outFile, 8, False, -1)

问题就会消失。

【讨论】:

  • 很好的答案,但术语 unicode is ambiguous 它对一个系统意味着一件事,而对另一个系统可能是 UTF-8UTF-16,具体取决于系统默认值。
  • 虽然Windows uses UTF-16应该没问题。
  • UTF-16 LE 是准确的。我同意一般来说“Unicode”这个词是模棱两可的,但是当谈到 VBScript 时,它总是指 UTF-16 LE。
  • 奇怪我刚刚在 Windows 8.1 上使用CreateTextFile(filepath, True) 尝试了一个测试脚本,用十六进制编辑器打开它时得到0D0A,不应该是0D00 0A00吗?
  • @Lankymart 对于CreateTextFile 方法,第三个参数定义了格式,而不是第二个。默认为 ASCII(与 OpenTextFile 相同)。使用CreateTextFile(filepath, True, True),你会得到预期的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
  • 2021-11-30
相关资源
最近更新 更多