我可以在运行时确定可用的 NLS 字符集吗?

我可以在运行时确定可用的 NLS 字符集吗?

我可以在 中找到内核支持的文件系统类型的列表/proc/filesystems

除了尝试挂载文件系统之外,有没有办法确定我可以通过选项mountiocharset来使用哪些字符集?nls

理想情况下,我希望列表位于 Bash 数组中,这样我就可以使用它来完成命令。

答案1

NLS 字符集提供为名称开头为的模块nls_。要确定支持的字符集,您可以:

  • 在以下位置查找内置字符集/lib/modules/$(uname -r)/modules.builtin

     grep kernel/fs/nls/nls_ /lib/modules/$(uname -r)/modules.builtin
    
  • 列出可用模块/lib/modules/$(uname -r)/kernel/fs/nls

     echo /lib/modules/$(uname -r)/kernel/fs/nls/nls_*
    

要获取可用列表,我们需要从模块文件路径中提取字符集名称:

#!/bin/bash
charsets=($(grep ^kernel/fs/nls/nls_ /lib/modules/$(uname -r)/modules.builtin)
         /lib/modules/$(uname -r)/kernel/fs/nls/nls_*)
charsets=("${charsets[@]##*/nls_}"); charsets=("${charsets[@]%.ko}")

nls_base.ko如果我们排除(不实现实际编码),这会产生一个适合命令完成的列表:

$ compgen -W "${charsets[*]}" -X base -- 
ascii
cp1250
cp1251
cp1255
cp437
cp737
cp775
cp850
cp852
cp855
cp857
cp860
cp861
cp862
cp863
cp864
cp865
cp866
cp869
cp874
cp932
cp936
cp949
cp950
euc-jp
iso8859-13
iso8859-14
iso8859-15
iso8859-1
iso8859-2
iso8859-3
iso8859-4
iso8859-5
iso8859-6
iso8859-7
iso8859-9
koi8-r
koi8-ru
koi8-u
utf8

相关内容