유니 코드 필레나 이름으로 std :: fstream (ofstream 또는 ifstream)을 열는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/821873

  •  03-07-2019
  •  | 
  •  

문제

Windows 애플리케이션을 위해 C ++ 표준 라이브러리를 사용하여 파일을 열는 것만 큼 기본적인 것을 상상하지 못할 것입니다. 여기서 유니 코드에 의해 나는 UTF-8을 의미하지만 UTF-16 또는 무엇이든 변환 할 수 있습니다. 포인트는 유니 코드 파일 이름에서 OfStream 인스턴스를 얻는 것입니다. 내 솔루션을 해킹하기 전에 여기에 선호하는 길이 있습니까? 특히 크로스 플랫폼?

도움이 되었습니까?

해결책

C ++ 표준 라이브러리는 유니 코드 인식이 아닙니다. char 그리고 wchar_t 유니 코드 인코딩 일 필요는 없습니다.

창문에서 wchar_t UTF-16이지만 표준 라이브러리에서 UTF-8 파일 이름에 대한 직접적인 지원은 없습니다 ( char Datatype은 Windows에서 유니 코드가 아닙니다)

MSVC (및 따라서 Microsoft STL)를 사용하면 FILESTREAMS의 생성자가 제공됩니다. const wchar_t* 파일 이름, 스트림을 다음과 같이 만들 수 있습니다.

wchar_t const name[] = L"filename.txt";
std::fstream file(name);

그러나이 과부하는 C ++ 11 표준에 의해 지정되지 않습니다 (단지 char 기반 버전). 버전 G ++ 4.8.x에서 Mingw (-W64) 용 GCC의 LIBSTDC ++와 같은 대체 STL 구현에는 존재하지 않습니다.

그냥 좋아합니다 char Windows에서는 UTF8이 아니며 다른 OS'es wchar_t UTF16이 아닐 수 있습니다. 따라서 전반적으로 이것은 휴대 성이 아닐 것입니다. 주어진 스트림을여십시오 wchar_t 파일 이름은 표준에 따라 정의되지 않으며 파일 이름을 지정합니다. charchar에서 사용하는 인코딩은 os'es마다 다르기 때문에 s가 어려울 수 있습니다.

다른 팁

현재 버전의 Visual C ++ std :: Basic_fstream에는 open() wchar_t*를 취하는 메소드 http://msdn.microsoft.com/en-us/library/4dx08bh4.aspx.

C ++ 17 이후, std :: FileSystem :: Path 초과 적재. C ++ 20까지 UTF-8 문자열에서 경로를 만들 수 있습니다. std :: FileSystem :: u8path. 예시:

std::ofstream out(std::filesystem::u8path(u8"こんにちは"));
out << "hello";

C ++ 20 후에는 UTF-8을 생성자에게 전달하여 경로를 만들 수 있습니다. std::filesystem::path(u8"こんにちは") (u8path는 더 이상 사용되지 않습니다).

사용 std::wofstream, std::wifstream 그리고 std::wfstream. 그들은 유니 코드 파일 이름을 받아들입니다. 파일 이름이 있어야합니다 wstring, 의 배열 wchar_tS, 또는 있어야합니다 _T() 매크로 또는 접두사 L텍스트 전에.

살펴보십시오 부스트:

#include <boost/nowide/fstream.hpp>
#include <boost/nowide/cout.hpp>
using boost::nowide::ifstream;
using boost::nowide::cout;

// #include <fstream>
// #include <iostream>
// using std::ifstream;
// using std::cout;

#include <string>

int main() {
    ifstream f("UTF-8 (e.g. ß).txt");
    std::string line;
    std::getline(f, line);
    cout << "UTF-8 content: " << line;
}

QT가 혼합 된 경우 std::ifstream:

return std::wstring(reinterpret_cast<const wchar_t*>(qString.utf16()));
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top