ファイル名に使用されているエンコーディングを確認するにはどうすればよいでしょうか?

ファイル名に使用されているエンコーディングを確認するにはどうすればよいでしょうか?

ロシア語(キリル文字)の名前が付いたファイルがいくつかあります。

Windows エクスプローラーで開くと、名前が正しく表示されます。

コマンド シェル (cmd) でリストすると、「?????」文字として表示されます。

ファイル名に使用されているエンコーディングを確認する方法はありますか?

コード ページの 1 つですか? (chcpコマンドを使用して、一般的なキリル文字コード ページ 866 と 1251 を試しましたが、うまくいきませんでした)。Unicode (65001 を試しましたが、うまくいきませんでした)? 他に何かありますか?

回答の方法は特に問いません(フリーウェアプログラム、Perl スクリプト、Powershell スクリプト、ファイルをアップロードさせる Web ページなど、すべて許容されます)。

システム: Windows XP SP3。

答え1

ファイル名のエンコーディングはファイルシステムによって定義されます。NTFS は UTF-16 を使用します。ただし、これは問題ではありません。

コマンドラインでは、dir単にバイトを盲目的にコピーするだけではありません。まず適切な OS 関数を呼び出してディレクトリを一覧表示し、受信したファイルの詳細をコンソールに出力する必要があります。

cmdがディレクトリ リストを取得するためにシステム関数を呼び出す場合、それは既に優先エンコーディングで返されることを予期しています (これは必ずしも選択したエンコーディングではありません。これについては後で詳しく説明します)。OS は物事を簡素化するために追加の抽象化レイヤーを提供するため、FS で内部的に使用されるエンコーディングは関係ありません。FS は想像できるあらゆるエンコーディングを使用できますが、OS がサポートしている限り、 cmdFS のエンコーディングではなく、優先エンコーディングでファイル名を受け取ります。

私が言及した「推奨エンコード」は、コードページが適用された ANSI または Unicode のいずれかです。Windows 2000 より前では、ANSI がデフォルトのエンコードとして使用されていました。Windows 2000 以降のバージョンでは、デフォルトで Unicode が使用されますが、ANSI プログラムも実行できます。

Unicode プログラムの場合、コード ページは完全に無視され、chcp効果はありません。これは、適切なコード ページが設定されていることを前提とする古い ANSI プログラムでのみ使用されます。Unicode では、コード ページはもはや問題ではありません。なぜなら、コード ページは明確に定義されており、適切なプログラムが出力できるすべてのものをサポートしているからです。

cmdUnicode をサポートしているため、すでに Unicode で記述されているファイル名を受け取ります。

すでにお分かりのとおり、原因はデフォルトのフォントでした。この問題については、chcp に関する Technet ページ:

Windows XP でインストールされた OEM (Original Equipment Manufacturer) コード ページのみが、ラスター フォントを使用するコマンド プロンプト ウィンドウに正しく表示されます。その他のコード ページは、全画面モードまたは TrueType フォントを使用するコマンド プロンプト ウィンドウに正しく表示されます。

関連情報