0

我正在构建一个通用函数来读取文本文件,可能是 Ascii、UTF-8 或 UTF-16。(调用函数时,编码是已知的)。文件名可能包含 UTF8 字符,因此标​​准的 lua io 函数不是解决方案。我无法控制 Lua 实现(5.3)或环境中可用的二进制模块。

我目前的代码是:

require "luacom"
local function readTextFile(sPath, bUnicode, iBits)
    local fso = luacom.CreateObject("Scripting.FileSystemObject")
    if not fso:FileExists(sPath) then return false, "" end --check the file exists

    local so = luacom.CreateObject("ADODB.Stream")
    --so.CharSet defaults to Unicode aka utf-16
    --so.Type defaults to text
      so.Mode = 1 --adModeRead

    if not bUnicode then
      so.CharSet = "ascii"
    elseif iBits == 8 then
      so.CharSet = "utf-8"
    end

    so:Open()
    so:LoadFromFile(sPath)
    local contents = so:ReadText()
    so:Close()
    return true, contents
end

--test Unicode(utf-16) files

local file = "D:\\OneDrive\\Desktop\\utf16.txt" --this exists
local booOK, factsetcontents = readTextFile(file, true, 16) 

执行时出现错误: COM exception:(d:\my\lua\luacom-master\src\library\tluacom.cpp,382):Operation is not allowed in this context在第 19 行 [local stream = so:LoadFromFile(sPath)]

我仔细阅读了 ADO 文档,显然遗漏了一些让我眼前一亮的东西!我想做的事是不可能的吗?

ETA:如果我注释掉 so.Mode = 1 行,这行得通。这很好,但我不明白为什么,这意味着我最终可能会在不知不觉中犯同样的错误,不管那个错误是什么!

4

1 回答 1

0

我不知道 AdoDB Stream.Mode 以及函数失败的原因。但我认为在 Windows 上使用 ADODB COM 对象来读取 ASCII/UTF8/UNICODE 编码文件相当棘手。

您可以改为:

  • 在二进制模式下使用标准 Lua io.open 函数并使用字节内容的手动解码
  • 使用二进制模块完成所有工作
  • 为 Windows 使用特定的 Lua 实现,它可以本地读取/写入这些编码文件,如LuaRT
于 2021-05-18T20:51:04.747 回答