63763
お世話になります。  
日本語版のwindows10のファイル名の文字コードはなんという文字コードなのでしょうか。

てっきりshift-jisだと思っていたのですが、タイ語などshift-jisに含まれない文字(= pythonの
`.encode('sjis_2004')` でエンコードできない文字)もファイル名に付けることができます。

これは、ファイル名がutf-8等のユニコードの符号化形式でエンコードされている、と考えていいのでしょうか。  
何卒よろしくおねがいします。
CC BY-SA 4.0
2020-03-11T10:13:26.843
63762
2020-03-11T12:31:28.697
28998
question
windows 文字コード
windowsのファイル名の文字コード
ここに記事がありますね。  
たどった先まで見ていくと、NTFSはUTF-16、FAT系は各国向けのSBCS,MBCSということになるかと思われます。

[Character Sets Used in File Names](https://docs.microsoft.com/en-
us/windows/win32/intl/character-sets-used-in-file-names)

> NTFS stores file names in Unicode. In contrast, the older FAT12, FAT16, and
> FAT32 file systems use the OEM character set. For more information, see Code
> Pages.
>
> Non-Unicode applications that create FAT files sometimes have to use the
> standard C runtime library conversion functions to translate between the
> Windows code page character set and the OEM code page character set. With
> Unicode implementations of the file system functions, it is not necessary to
> perform such translations.
>
> NTFSはファイル名をUnicodeで保存します。
> 対照的に、古いFAT12、FAT16、およびFAT32ファイルシステムはOEM文字セットを使用します。 詳細については、コードページを参照してください。
>
>
> FATファイルを作成する非Unicodeアプリケーションでは、標準のCランタイムライブラリ変換関数を使用して、Windowsコードページの文字セットとOEMコードページの文字セットを変換する必要がある場合があります。ファイルシステム関数のUnicode実装では、このような変換を実行する必要はありません。

上記ページから参照されているページ  
[Code Pages](https://docs.microsoft.com/en-us/windows/win32/intl/code-pages)  
[Windows Data Types for Strings](https://docs.microsoft.com/en-
us/windows/win32/intl/windows-data-types-for-strings)  
[Conventions for Function Prototypes](https://docs.microsoft.com/en-
us/windows/win32/intl/conventions-for-function-prototypes)  
[Unicode](https://docs.microsoft.com/en-us/windows/win32/intl/unicode)

> Unicode-enabled functions are described in Conventions for Function
> Prototypes. These functions use UTF-16 (wide character) encoding, which is
> the most common encoding of Unicode and the one used for native Unicode
> encoding on Windows operating systems. Each code value is 16 bits wide, in
> contrast to the older code page approach to character and string data, which
> uses 8-bit code values.
>
>
> Unicode対応の関数については、「関数プロトタイプの規則」で説明しています。これらの関数は、UTF-16（ワイド文字）エンコードを使用します。これは、Unicodeの最も一般的なエンコードであり、WindowsオペレーティングシステムのネイティブUnicodeエンコードに使用されるエンコードです。8ビットコード値を使用する文字および文字列データに対する古いコードページアプローチとは対照的に、各コード値は16ビット幅です。

[Unicode in the Windows API](https://docs.microsoft.com/en-
us/windows/win32/intl/unicode-in-the-windows-api)  
[Security Considerations: International
Features](https://docs.microsoft.com/en-us/windows/win32/intl/security-
considerations--international-features)

* * *

@sayuri さん回答を見て：  
そういえばVFATなんてありましたね。ということで追記  
実はファイル名の文字コードの話は多くはありませんが。

[VFATとは何？ Weblio辞書](https://www.weblio.jp/content/VFAT)

>
> VFATとは、DOSにおけるFATのファイル名が最大11文字（8文字と拡張子3文字）である制約を緩和して、最大255文字までファイル名が使えるようにしたファイルシステムのことである。  
>  VFATは、Windows NT
> 3.5から導入され、登場当初は「ロングファイルネーム」と言われて注目された。現在では、VFATは、一般的に使われるようになっている。

良くまとまっていて読みごたえがありますね。  
[第9回 Windowsのファイルシステムの概要とFATファイルシステム
(1/2)](https://www.atmarkit.co.jp/ait/articles/1507/16/news034.html)  
[第9回 Windowsのファイルシステムの概要とFATファイルシステム
(2/2)](https://www.atmarkit.co.jp/ait/articles/1507/16/news034_2.html)

英語版StackOverflow記事とその回答のTechNet記事  
[What is the difference between VFAT and FAT32 file
systems?](https://stackoverflow.com/q/11928982/9014308)  
[Choosing Between File Systems](https://docs.microsoft.com/en-us/previous-
versions//cc750354\(v=technet.10\)?redirectedfrom=MSDN)  
NT系OSではもう純粋なFATフォーマットは出来ないもよう。

Linux系での情報記事  
[Filesystems HOWTO: 3. DOS FAT 12/16/32,
VFAT](https://linuxjf.osdn.jp/JFdocs/Filesystems-HOWTO-3.html)  
[Linux Kernel 2.2 Documentation:
filesystems/vfat.txt](http://archive.linux.or.jp/JF/JFdocs/kernel-
docs-2.2/filesystems/vfat.txt.html)
CC BY-SA 4.0
2020-03-11T10:34:32.240
63763
2020-03-11T12:31:28.697
2020-06-17T08:14:45.997
-1
26370
63762
answer
Windowsは内部処理がUnicode化されています。その上で、アプリケーションに提供されるAPIはUnicodeバージョンとANSI（日本語版ではShift-
JIS）バージョンの２種類が提供されています。ANSIバージョンが呼ばれた場合には必要に応じて文字コード変換されます。

その上で、ファイルシステムAPIにおいても同様です。実際のストレージがどのような文字コードを採用していようがWindows内部ではUnicodeで処理されます。

よって、アプリケーションがUnicodeバージョンのファイルシステムAPIを呼び出し、尚且つ実際のストレージがUnicodeを採用している場合に、ファイル名としてUnicodeが使用できます。  
その上で、NTFS（実のところFAT32やFAT16もVFATがあるので）ではUnicodeを採用しています。

なお、UNIX系OSではOS内部で文字コード変換しておらず、またファイルシステムAPIもアプリケーションから渡されたバイト列をそのままストレージに書き込みます。そのため、アプリケーションがストレージ毎に文字コードを意識して処理する必要があります。
CC BY-SA 4.0
2020-03-11T11:52:54.583
63767
2020-03-11T11:52:54.583
4236
63762
answer