2012-01-12 1 views
18

Windows API ANSI 함수를 UTF-8 문자열과 함께 사용할 수 있습니까?Windows API ANSI 함수 및 UTF-8

예를 들어 UTF-8로 인코딩 된 경로가 있다고 가정 해보십시오. CreateDirectoryA 또는 CreateFileA으로 전화하여 UTF-8 경로를 사용할 수 있습니까? 아니면 함수를 호출하기 전에 변환을 수행해야합니까?

+2

이궁을. 왜 누군가는 그것을 원할 것입니까? 나는 우리가 Windows ME를 지나서 왔다고 생각한다. (그것은 ANSI API를 필요로했던 마지막 Windows 버전이었다.) 그들은 이미, 특히 새로 개발 된 응용 프로그램에 대한 죽어야한다. – Joey

+1

UTF-8 문자열은 어디에서 구할 수 있습니까? 소위 와이드 버전 Windows API 함수에서 요구하는 것처럼 응용 프로그램을 UTF-16 문자열로 완전히 변환하는 것이 훨씬 쉽습니다. 그리고 조이 (Joey)가 말했듯이, * 항상 ANSI 버전이 아닌 와이드 버전 ('W' 접미사 포함)을 호출합니다. 그것들은 수십 년 동안 쓸모 없어졌습니다. –

+4

@Joey : C (++) 라이브러리 (표준 라이브러리 포함)가'wchar_t' 기반 문자열 대신'char' 기반 문자열로 작업하기를 선호하기 때문에. Windows가 UTF-8을 완벽하게 지원한다면, UTF-8과 UTF-16 사이에서 항상 변환하는 대신 프로그램 전체에서 UTF-8을 사용할 수 있습니다. – dan04

답변

15

아니요 MultiByteToWideChar을 사용하여 UTF-8을 UTF-16으로 변환 한 다음 CreateDirectoryW 또는 CreateFileW과 같은 와이드 캐릭터 API를 호출하십시오.

+0

젠장, 나는 두려웠다. :(Gah .. 그때 시작했다. .. – krebstar

+12

나는 윈도우가 UTF-16을 독점적으로 사용하고 있기 때문에 그것을 추가 할 것이고, 그것은 당신이 UTF 대부분 -16이고, 외부 소스에서 읽거나 쓸 필요가있을 때만 UTF-8로 변환하십시오. – casablanca

+4

@casablanca : 대다수의 경우 UTF-8을 사용하고 Windows 인터페이스와 대화 할 때만 UTF-16에서 가져옵니다. –

3

원시 Win32 API MultiByteToWideChar를 사용하는 것보다 쉬운 접근 방법은 CA2CW과 같은 ATL conversion helpers을 사용하는 것입니다. 당신은 UTF-8 유니 코드 UTF-16 유니 코드 변환, 코드 페이지 (생성자의 두 번째 매개 변수)로 CP_UTF8을 지정할 수 있습니다

CreateDirectoryW( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
); 

참고 유니 코드 빌드를 (기본 것들을해야하는이 일)은 CreateDirectory은 CreateDirectoryW로 확장, 그래서 난 그냥 "W"로 끝나는 삭제하고 (IMHO, 더 읽기) CreateDirectory 사용합니다 :

CreateDirectory( 
    CA2W(utf8Name, CP_UTF8) // convert from UTF-8 to UTF-16 
    ... // other stuff 
);