파일 이름이 어떤 인코딩을 사용하고 있는지 어떻게 알 수 있나요?

파일 이름이 어떤 인코딩을 사용하고 있는지 어떻게 알 수 있나요?

러시아어(키릴 문자) 이름을 가진 파일이 몇 개 있습니다.

Windows 탐색기에서 열면 이름이 올바르게 표시됩니다.

명령 셸(cmd)에 나열하면 "????????"로 표시됩니다. 성격.

파일 이름에 어떤 인코딩이 사용되었는지 알 수 있는 방법이 있나요?

코드 페이지 중 하나인가요? (나는 chcp행운없이 명령을 사용하여 일반적인 키릴 코드 페이지 866과 1251을 시도했습니다 ). 유니코드(65001을 시도했지만 운이 없었습니다)? 다른 것?

나는 답변 방법에 대해 특별히 신경 쓰지 않습니다(다음 모두 허용됩니다: 프리웨어 프로그램, Perl 스크립트, Powershell 스크립트, 파일을 업로드하게 만드는 웹 페이지).

시스템: Windows XP SP3.

답변1

파일 이름 인코딩은 파일 시스템에 의해 정의됩니다. NTFS는 UTF-16을 사용합니다. 하지만 그것은 중요하지 않습니다.

명령줄 에서는 dir맹목적으로 바이트를 복사하는 것이 아닙니다. 먼저 적절한 OS 기능을 호출하여 디렉터리를 나열한 다음 수신된 파일 세부 정보를 콘솔에 인쇄해야 합니다.

cmd디렉토리 목록을 검색하기 위해 시스템 함수를 호출할 때 이미 선호하는 인코딩으로 반환될 것으로 예상합니다(반드시 선택한 인코딩일 필요는 없습니다. 이에 대해서는 나중에 자세히 설명합니다). OS는 작업을 단순화하기 위해 추가 추상화 계층을 제공하기 때문에 FS에서 내부적으로 어떤 인코딩이 사용되는지는 중요하지 않습니다. FS는 상상할 수 있는 모든 인코딩을 사용할 수 있지만 OS가 지원하는 한 cmdFS의 인코딩이 아닌 기본 인코딩으로 파일 이름을 받게 됩니다.

제가 언급한 "기본 인코딩"은 코드 페이지가 적용된 ANSI 또는 유니코드입니다. ANSI는 Windows 2000 이전에는 기본 인코딩으로 사용되었습니다. Windows 2000 및 최신 버전에서는 기본적으로 유니코드를 사용하지만 여전히 ANSI 프로그램을 실행할 수 있습니다.

유니코드 프로그램의 경우 코드페이지는 완전히 무시되며 chcp아무런 효과도 없습니다. 이는 적절한 코드 페이지 설정에 의존하는 이전 ANSI 프로그램에만 사용됩니다. 유니코드는 잘 정의되어 있고 합리적인 프로그램이 출력할 수 있는 모든 것을 지원하기 때문에 더 이상 중요하지 않습니다.

cmd유니코드를 지원하므로 이미 유니코드로 된 파일 이름을 받게 됩니다.

이미 알고 있듯이 범인은 기본 글꼴이었습니다. 이 문제는 다음에 언급되어 있습니다.chcp의 Technet 페이지:

Windows XP와 함께 설치된 OEM(Original Equipment Manufacturer) 코드 페이지만 래스터 글꼴을 사용하는 명령 프롬프트 창에 올바르게 나타납니다. 다른 코드 페이지는 전체 화면 모드나 트루타입 글꼴을 사용하는 명령 프롬프트 창에서 올바르게 나타납니다.

관련 정보