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)
在 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)