CString CFileDataIO::ReadString(bool bOptUTF8, UINT uRawSize) { #ifdef _UNICODE const UINT uMaxShortRawSize = SHORT_RAW_ED2K_UTF8_STR; if (uRawSize <= uMaxShortRawSize) { char acRaw[uMaxShortRawSize]; Read(acRaw, uRawSize); if (uRawSize >= 3 && (UCHAR)acRaw[0] == 0xEFU && (UCHAR)acRaw[1] == 0xBBU && (UCHAR)acRaw[2] == 0xBFU) { WCHAR awc[uMaxShortRawSize]; int iChars = ByteStreamToWideChar(acRaw + 3, uRawSize - 3, awc, ARRSIZE(awc)); if (iChars >= 0) return CStringW(awc, iChars); } else if (bOptUTF8) { WCHAR awc[uMaxShortRawSize]; //int iChars = ByteStreamToWideChar(acRaw, uRawSize, awc, ARRSIZE(awc)); int iChars = utf8towc(acRaw, uRawSize, awc, ARRSIZE(awc)); if (iChars >= 0) return CStringW(awc, iChars); } return CStringW(acRaw, uRawSize); // use local codepage } else { Array<char> acRaw(uRawSize); Read(acRaw, uRawSize); if (uRawSize >= 3 && (UCHAR)acRaw[0] == 0xEFU && (UCHAR)acRaw[1] == 0xBBU && (UCHAR)acRaw[2] == 0xBFU) { Array<WCHAR> awc(uRawSize); int iChars = ByteStreamToWideChar(acRaw + 3, uRawSize - 3, awc, uRawSize); if (iChars >= 0) return CStringW(awc, iChars); } else if (bOptUTF8) { Array<WCHAR> awc(uRawSize); //int iChars = ByteStreamToWideChar(acRaw, uRawSize, awc, uRawSize); int iChars = utf8towc(acRaw, uRawSize, awc, uRawSize); if (iChars >= 0) return CStringW(awc, iChars); } return CStringW(acRaw, uRawSize); // use local codepage } #else CStringA strA; Read(strA.GetBuffer(uRawSize), uRawSize); strA.ReleaseBuffer(uRawSize); return strA; #endif }
CStringW CFileDataIO::ReadStringUTF8() { UINT uRawSize = ReadUInt16(); const UINT uMaxShortRawSize = SHORT_RAW_ED2K_UTF8_STR; if (uRawSize <= uMaxShortRawSize) { char acRaw[uMaxShortRawSize]; Read(acRaw, uRawSize); WCHAR awc[uMaxShortRawSize]; int iChars = ByteStreamToWideChar(acRaw, uRawSize, awc, ARRSIZE(awc)); if (iChars >= 0) return CStringW(awc, iChars); return CStringW(acRaw, uRawSize); // use local codepage } else { Array<char> acRaw(uRawSize); Read(acRaw, uRawSize); Array<WCHAR> awc(uRawSize); int iChars = ByteStreamToWideChar(acRaw, uRawSize, awc, uRawSize); if (iChars >= 0) return CStringW(awc, iChars); return CStringW(acRaw, uRawSize); // use local codepage; } }