문제

C Windows 프로그램에서 코드 페이지를 UTF-8로 설정하려면 어떻게해야합니까?

Fopen을 사용하여 파일을 열 수있는 타사 라이브러리가 있습니다. wcstombs를 사용하여 유니 코드 파일 이름을 현재 코드 페이지로 변환 할 수 있지만, 사용자가 코드 페이지 외부에 문자가있는 파일 이름이있는 경우 해석됩니다.

이상적으로는 코드 페이지를 UTF-8로 설정하려면 _SetMBCP (65001) 호출하지만 _SETMBCP에 대한 MSDN 문서는 UTF-8이 지원되지 않는다고 말합니다.

이 문제를 어떻게 해결할 수 있습니까?

도움이 되었습니까?

해결책

불행히도, 유니 코드를 Windows에서 현재 코드 페지로 만들 수있는 방법은 없습니다. 그만큼 CP_UTF7 그리고 CP_UTF8 상수는 의사-코드 페지이며, 만 사용됩니다 MultibyteWideChar 그리고 Widechartomultibyte Ben이 언급 한 것처럼 변환 기능.

귀하의 문제는 FSTREAM C ++ 클래스의 문제와 유사합니다. fstream 생성자는 만 허용됩니다 char* 이름, 진정한 유니 코드 이름이있는 파일을 열 수 없습니다. VC가 제공하는 유일한 솔루션은 해킹이었습니다. 파일을 별도로 열고 핸들을 스트림 객체로 설정하십시오. 물론 타사 도서관이 핸들을 허용하지 않기 때문에 이것이 당신에게 옵션이 아닙니다.

내가 생각할 수있는 유일한 솔루션은 원본에 단단히 연결된 비공개 이름의 임시 파일을 만들고 매개 변수로 사용하는 것입니다.

다른 팁

모든 Windows API는 UTF-16에서 생각하므로 경계에서 변환하는 라이브러리 주위에 래퍼를 쓰는 것이 좋습니다.

이상하게도 Windows는 UTF-8이 변환의 목적으로 코드가 있다고 생각하므로 CodePages간에 변환하는 것과 동일한 API를 사용합니다.

std::wstring Utf8ToUtf16(const char* u8string)
{
    int wcharcount = strlen(u8string);
    wchar_t *tempWstr = new wchar_t[wcharcount];
    MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
    wstring w(tempWstr);
    delete [] tempWstr;
    return w;
}

그리고 다시 전환 할 비슷한 형태의 것.

2018 업데이트 : Windows 10은 "65001"코드 페이지를 두 단계로 "의사"로 만들었습니다.

  1. conhost 변경 사항 : Linux의 Windows 서브 시스템은 콘솔에 코드 65001을 사용합니다. 실행할 수도 있습니다 chcp 65001 안에 cmd.exe WSL 이후. (일부를 일으켰습니다 꽤 멍청한 파이썬 버그.)
  2. 완전한 기능화 로케일 : 빌드 17035 이후의 창 UTF-8을 로케일 코드로 설정할 수 있습니다. 2018 년 4 월 업데이트에서 사용할 수 있습니다.

Cygwin (기본적으로 UTF-8 로케일을 제공하는)을 사용하거나 필요한 UTF-8에서 UTF-16 번역을 수행하는 Windows에 대해 자신의 LIBC 해킹을 작성하고 비표준을 랩핑하십시오. _wfopen 등. 기능.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top