LUA: 如何正确读取带有重音字母和变音符号的 UFT8 文件名和路径?

LUA: how to correctly read UFT8 file names and path with accented letters and umlaut?

在 LUA 中的一个更复杂的脚本中,我创建了以下函数,它应该 检索位于目录中的所有音频文件的列表,该目录在调用函数时指定(第一个参数)。

函数 returns 格式化 HTML 行或 CSV 行,基于第二个参数的值。

如果为 1,则 returns HTML 如果为 2,则 returns CSV

除非路径 and/or 文件名没有重音字母或元音变音,否则此函数工作正常。 然后失败。

这里是一个夸张的例子,我用它做了测试:

J:\PRODUCTION\tüv-ààéérï-utf8\Rendering\tüv-ààéérï-utf8_.wav

我确实尝试过像这里介绍的那样实施解决方案:

这里:

但没有成功。

有没有办法在 LUA 中获取具有 accented/umlauted 个字符的文件名和路径?

重要提示: LUA 解释器不是独立的。它是内置音频应用程序 Reaper 的一款。 因此,我无法单独安装某些特定的 LUA 扩展。 所以,我需要写一些代码,但我完全迷路了。 [编辑] 操作系统 Windows,但我也应该在 Mac 和 Linux 上工作

----------------------------------------------
-- SCAN RENDERED AUDIO
----------------------------------------------
function scandir(directory,format)
  local i, t, popen = 0, {}, io.popen
  t = ''
  local f=io.popen('dir '..directory)
    for filename in popen('dir "'..directory..'" /b'):lines() do
      local extension = filename:match("^.+(%..+)$")
      if extension == ".wav" or
         extension == ".mp3" or
         extension == ".flac" or
         extension == ".mov" or
         extension == ".ogg" or
         extension == ".mp4" then
          uriFormat = filename:gsub(" ", "%%20")
          if format == 1 then
            t = t..'<tr class="Rendered"><td>'..directory..'</td><td>'..tostring(filename)..'</td><td><audio controls src="'..directory..'/'..tostring(uriFormat)..'"/></td></tr>'
          elseif format == 2 then
            t = t..directory..','..tostring(filename)..','..directory..tostring(filename)..LF
          end
          i = i + 1
      end
 
    end
  return t
end

第一个问题是将 dir 命令的输出转换为 UTF8 字符串。

在您的磁盘上的某处创建文件 cp.bat

@chcp %1 >nul

替换
popen('dir "'..

popen('C:\path\to\cp.bat 65001 <nul & dir "'..


第二个问题是将输入参数 directory(作为参数传递给函数 scandir 的 UTF-8 字符串)转换为正确的编码。
io.popen 期望它的参数在 1252 代码页中。
因此,使用 this script.
中的函数 utf8_to_win 不要忘记在第 11 行设置代码页 (1252)