gnuplot:如何获取包含非 ANSI 字符的文件列表?

gnuplot: How to get a file list with non-ANSI characters?

我想将几个文件加载到 gnuplot(在 Windows 下)。 为此,我使用命令 system()。检查以下最小示例。 只要文件名中只有 ANSI 字符,这就可以正常工作。

嗯,希腊字母和基里尔字母表可能是极端情况,但是像 ä,ö,ü,ß,é,à,ñ... 这样的字符如果能正确处理就更好了。

当然可以:

是否有 gnuplot 的直接解决方案来处理这些特殊字符?

代码:

### get a file list from a directory (Windows)
reset session
set encoding utf8

PATH = 'CountryTest\'
GetFileList(p,f) = sprintf('dir /b "%s%s"', p, f)

FILES = system(GetFileList(PATH,'*.dat'))
print FILES

set print "Countries.txt"
    print FILES
set print
### end of code

结果 1:(gnuplot 5.2.8 控制台,编码为 utf8)

Belgi�.dat
C�te d'Ivoire.dat
Espa�a.dat
L�tzebuerg.dat
M�xico.dat
Panam�.dat
Per�.dat
Rom�nia.dat
T�rkiye.dat
�ire.dat
�sland.dat
�sterreich.dat
Cesko.dat
?????.dat
??????.dat

Result2:(gnuplot创建的文件Countries.txt,Notepad++告诉我文件是ANSI编码的)

Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat

更新:

如果我在 Windows 控制台中键入以下内容:

chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"

我得到文件 Countries.txt:

België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat

但是,如果我在 gnuplot 脚本中使用相同的命令:

system('chcp 65001 && dir /b "CountryTest\*.dat" > "CountryTest\Countries.txt"')

我得到这个文件 Countries.txt:

Belgi‰.dat
C“te d'Ivoire.dat
Espa¤a.dat
L‰tzebuerg.dat
M‚xico.dat
Panam .dat
Per£.dat
Romƒnia.dat
Trkiye.dat
ire.dat
Ösland.dat
™sterreich.dat
Cesko.dat
?????.dat
??????.dat

那么,gnuplot 的 system() 命令出了什么问题?

感谢 superuser 上的用户@ItWasn'tMe,我最终得到了一个解决方案,除非在 gnuplot 中直接实现,否则可能无法进一步改进。

起点:(具有以下文件名的子目录CountryTest\

België.dat
Côte d’Ivoire.dat
España.dat
Lëtzebuerg.dat
México.dat
Panamá.dat
Perú.dat
România.dat
Türkiye.dat
Éire.dat
Ísland.dat
Österreich.dat
Česko.dat
Ελλάς.dat
Россия.dat

代码:(使用 Windows 10 和 gnuplot >=5.2.0 测试)

### get UTF8 file list into a datablock (Windows)
reset session

# get UTF8 filenames of a filtered directory (Windows only)
GetFileList(p,f,d) = sprintf('<ECHO %s ^<^<EOD & <CON: chcp 65001 >nul & cmd.exe /c dir /b "%s%s"', d, p, f)

PATH = 'CountryTest\'
EXPR = '*.dat'

load GetFileList(PATH, EXPR, '$myFiles')

set offsets 1,1,1,1

plot $myFiles u 0:0:($Data[[=11=]+1]) w labels notitle
### end of code

结果: