bool convertUTF16ToUTF8String(const std::u16string& utf16, std::string &Out) { assert(Out.empty()); // Avoid OOB by returning early on empty input. if (utf16.empty()) return true; const UTF16 *Src = reinterpret_cast<const UTF16 *>(utf16.data()); const UTF16 *SrcEnd = reinterpret_cast<const UTF16 *>(utf16.data() + utf16.length()); // Byteswap if necessary. std::vector<UTF16> ByteSwapped; if (Src[0] == UNI_UTF16_BYTE_ORDER_MARK_SWAPPED) { ByteSwapped.insert(ByteSwapped.end(), Src, SrcEnd); for (size_t I = 0, E = ByteSwapped.size(); I != E; ++I) ByteSwapped[I] = SwapByteOrder_16(ByteSwapped[I]); Src = &ByteSwapped[0]; SrcEnd = &ByteSwapped[ByteSwapped.size() - 1] + 1; } // Skip the BOM for conversion. if (Src[0] == UNI_UTF16_BYTE_ORDER_MARK_NATIVE) Src++; // Just allocate enough space up front. We'll shrink it later. Out.resize(utf16.length() * UNI_MAX_UTF8_BYTES_PER_CODE_POINT + 1); UTF8 *Dst = reinterpret_cast<UTF8 *>(&Out[0]); UTF8 *DstEnd = Dst + Out.size(); ConversionResult CR = ConvertUTF16toUTF8(&Src, SrcEnd, &Dst, DstEnd, strictConversion); assert(CR != targetExhausted); if (CR != conversionOK) { Out.clear(); return false; } Out.resize(reinterpret_cast<char *>(Dst) - &Out[0]); return true; }
//same thing as contructor. can be used to reinit dirList too void dirList::reassign(const std::u16string p) { entry.clear(); FSUSER_OpenDirectory(&d, a, fsMakePath(PATH_UTF16, p.data())); u32 read = 0; do { FS_DirectoryEntry getEnt; FSDIR_Read(d, &read, 1, &getEnt); entry.push_back(getEnt); }while(read > 0); FSDIR_Close(d); }
dirList::dirList(FS_Archive arch, const std::u16string p) { //keep archive data a = arch; //save path path = p; //open path given by p FSUSER_OpenDirectory(&d, a, fsMakePath(PATH_UTF16, p.data())); //loop until we stop reading anymore entries u32 read = 0; do { FS_DirectoryEntry getEnt; FSDIR_Read(d, &read, 1, &getEnt); entry.push_back(getEnt); }while(read > 0); FSDIR_Close(d); }
input_u16string_buffer::input_u16string_buffer(std::u16string const & data) : data_(data.size() + 1) { memcpy(data_.data(), data.data(), data_.size() * sizeof(char16_t)); }
std::string to_utf8(const std::u16string &s) { std::wstring_convert<std::codecvt_utf8<int16_t>, int16_t> convert; auto p = reinterpret_cast<const int16_t *>(s.data()); return convert.to_bytes(p, p + s.size()); }
// VS 2015 Bug: https://social.msdn.microsoft.com/Forums/en-US/8f40dcd8-c67f-4eba-9134-a19b9178e481/vs-2015-rc-linker-stdcodecvt-error?forum=vcgeneral std::string utf16_to_utf8(std::u16string utf16_string) { std::wstring_convert<std::codecvt_utf8_utf16<int16_t>, int16_t> convert; auto p = reinterpret_cast<const int16_t *>(utf16_string.data()); return convert.to_bytes(p, p + utf16_string.size()); }