[C++/Windows] wstring/UTF16でエンコードされたファイルを読み込む

wstring の場合

#include <codecvt>
#include <iostream>
#include <locale>
#include <fstream>

int main()
{
    std::basic_ifstream<wchar_t> ifs("C:\\hoge1.txt", std::ios::binary);
    ifs.imbue(std::locale(
        ifs.getloc(), 
        new std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode( std::little_endian |std::consume_header)>));

    std::vector<wchar_t> buf(100);
    ifs.read(buf.data(), 100);
    std::basic_string<wchar_t> istr(buf.data());
}

UTF16の場合

#include <codecvt>
#include <iostream>
#include <locale>
#include <fstream>

int main()
{
    std::basic_ifstream<uint16_t> ifs("C:\\hoge1.txt", std::ios::binary);
    ifs.imbue(std::locale(
        ifs.getloc(), 
        new std::codecvt_utf16<uint16_t, 0x10ffff, std::codecvt_mode( std::little_endian |std::consume_header)>));

    std::vector<uint16_t> buf(100);
    ifs.read(buf.data(), 100);
    std::basic_string<uint16_t> istr(buf.data());
}

[C++] UTF32からUTF16への変換

#include <codedvt>
#include <locale>

const std::u16string u32ToU16(std::u32string u32Str) {
    // codecvt_mode で little endian を指定
    std::wstring_convert<std::codecvt_utf16<uint32_t, 0x10ffff, (std::codecvt_mode)1>, uint32_t> converter;
    return reinterpret_cast<const char16_t *>(converter.to_bytes(reinterpret_cast<const uint32_t*>(u32Str.c_str())).c_str());
}

VS2015の不具合(*)によりchar32_tが使えないためuint32_tを指定しているが、LinuxやMacであればchar32_tでよいはず。

(*リンクエラーになる)