Filesystems 如何知道文件名的字符编码取决于文件系统

Filesystems 如何知道文件名的字符编码取决于文件系统,filesystems,filenames,Filesystems,Filenames,我想知道文件系统中文件名的字符编码,以便在GUI中正确显示它们 我该怎么做 我想我会根据文件系统(FAT、NTFS、ext3等)得到不同的字符编码 多谢各位 (我在C++中工作,但是这个主题不是语言相关的) NTFS是Unicode(UTF16)。exFAT也是Unicode 原始FAT和fAT32使用OEM字符集(请阅读更多信息) 在Linux和Unix上,文件名可以包含除NUL之外的任何字节,并且未定义字符集。因此,每个应用程序自行决定使用哪个应用程序。许多应用程序使用UTF8。更多信息请参

我想知道文件系统中文件名的字符编码,以便在GUI中正确显示它们

我该怎么做

我想我会根据文件系统(FAT、NTFS、ext3等)得到不同的字符编码

多谢各位

(我在C++中工作,但是这个主题不是语言相关的)

NTFS是Unicode(UTF16)。exFAT也是Unicode

原始FAT和fAT32使用OEM字符集(请阅读更多信息)

在Linux和Unix上,文件名可以包含除NUL之外的任何字节,并且未定义字符集。因此,每个应用程序自行决定使用哪个应用程序。许多应用程序使用UTF8。更多信息请参阅


大多数文件系统都使用上述unix方法(主要是因为“字符集”概念在操作系统级别上比在存储级别上更有意义)。您可以检查有关文件名字符的FS功能和要求(表2第3列)。

在Linux中运行以下命令:locale | egrep“LANG=“| cut-d”-f2

在类Unix系统上,文件名的编码不是在文件系统级别设置的,而是在用户环境中设置的。例如,UTF-8是Ubuntu中的默认设置

在Windows上,默认编码是CP-1252(又名ISO-8859-1或拉丁语-1),但FS通过UTF-16编码使用Unicode。看

但是如果您使用Qt,您可以使用Qt Creator构建以下内容,并且结果是当前的用户编码名称

#include <QTextCodec>
#include <iostream>

using namespace std;
int main(int argc, char *argv[])
{
  Q_UNUSED(argc); Q_UNUSED(argv);
  QTextCodec* tc = QTextCodec::codecForLocale();

  cout << "Current names text codec: " << tc->name().data() << endl;
  return 0;
}
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{
Q_未使用(argc);Q_未使用(argv);
QTextCodec*tc=QTextCodec::codeforLocale();

cout Unicode是一种抽象表示,而不是字节表示。您需要一种编码来将Unicode转换为字节。@user803422“Unicode”在Windows中代表UTF16。我已经更新了答案。在我的Windows 7-NTFS驱动器上,文件名是UTF-8。因此UTF-16不是一个通用规则。MSDN解释相当复杂。它取决于filsystem本身。一些文件系统支持字符编码,而一些文件系统只支持字符编码。大多数文件系统不将编码存储在文件系统本身中因为编码已经由其规范文档定义。您必须手动将这些信息存储在您自己的数据库中。这实际上取决于API,因此也取决于平台(OS)您正在使用。但是,在C++17中,可能包含完整的文件系统标准库,这可能会以某种方式解决此问题。ISO 8859-1和Latin-1是相同的,但Windows-1252/CP-1252略有不同:此编码是ISO 8859-1的超集,但与IANA的ISO-8859-1不同,它使用80到9F(十六进制)范围内的可显示字符而不是控制字符-