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

Posted

技术标签:

【中文标题】LUA:如何正确读取带有重音字母和变音符号的 UFT8 文件名和路径?【英文标题】:LUA: how to correctly read UFT8 file names and path with accented letters and umlaut? 【发布时间】:2022-01-07 05:39:38 【问题描述】:

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

该函数根据第二个参数的值返回格式化的 html 行或 CSV 行。

如果为 1,则返回 HTML 如果为 2,则返回 CSV

除非路径和/或文件名没有重音字母或变音符号,否则此功能可以正常工作。 然后失败。

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

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

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

converting UTF-8 string to ASCII in pure LUA

这里:

Handle special characters in lua file path (umlauts)

但没有成功。

有没有办法在 LUA 中获取带有重音/变音符号的文件名和路径?

重要提示: 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

【问题讨论】:

【参考方案1】:

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

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

@chcp %1 >nul

替换popen('dir "'..popen('C:\\path\\to\\cp.bat 65001 &lt;nul &amp; dir "'..


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

【讨论】:

请问用什么来创建空的 cp.bat?并且:您链接到我的功能是否正确转换变音符号?关于第 11 行:最终的 html 页面是 UTF8 格式的,所以我也需要重新转换为 UTF8 格式。 empty cp.bat 此文件不能为空。它包含 1 行代码。您可以创建一个 .txt 文件并将其重命名为 .bat。 is properly converting the umlaut?是的 i should work also on Mac and Linux - 你应该有单独的 Lua 代码分支用于 windows(有转换)和 linux(没有)。 Lua 可以通过os.getenv"OS"查看操作系统 好的,我现在正在连接您建议的代码。只是不要提交错误: 1. .bat 中的代码行是否为:@chcp %1 >nul?我想是的。你能确认或更正我吗? 2. "popen('dir "'.." 出现了 2 次。我想我必须对两者都进行更改。对吗? Dir 传递给函数:J:\PRODUCTION\tüv-ààéérï-utf8/Rendering Dir after conversion utf8_to_win(): J:\PRODUCTION\tüv-??éér?-utf8/Rendering I need使用 win_to_utf8() 在 UTF8 上重新转换,但我得到:J:\TUTORIALS\tüv-??éér?-utf8/Rendering lost the characters

以上是关于LUA:如何正确读取带有重音字母和变音符号的 UFT8 文件名和路径?的主要内容,如果未能解决你的问题,请参考以下文章

如何复制 Safari 的“模式”属性?

mysql查询选择喜欢带有变音符号的土耳其字母

Azure 搜索语言分析器和变音符号

局部匹配忽略案例和变音符号

如何从 .NET 中的字符串中删除变音符号(重音符号)?

如何从 .NET 中的字符串中删除变音符号(重音符号)?