bool GetTextConfig(const AString &s, CObjectVector<CTextConfigPair> &pairs) { pairs.Clear(); unsigned pos = 0; ///////////////////// // read strings for (;;) { if (!SkipSpaces(s, pos)) break; CTextConfigPair pair; unsigned finishPos; AString temp = GetIDString(((const char *)s) + pos, finishPos); if (!ConvertUTF8ToUnicode(temp, pair.ID)) return false; if (finishPos == 0) return false; pos += finishPos; if (!SkipSpaces(s, pos)) return false; if (s[pos] != '=') return false; pos++; if (!SkipSpaces(s, pos)) return false; if (s[pos] != '\"') return false; pos++; AString message; for (;;) { if (pos >= s.Len()) return false; char c = s[pos++]; if (c == '\"') break; if (c == '\\') { c = s[pos++]; switch (c) { case 'n': message += '\n'; break; case 't': message += '\t'; break; case '\\': message += '\\'; break; case '\"': message += '\"'; break; default: message += '\\'; message += c; break; } } else message += c; } if (!ConvertUTF8ToUnicode(message, pair.String)) return false; pairs.Add(pair); } return true; }
void CInArchive::ReadName(CItemEx &item, int nameSize) { item.UnicodeName.Empty(); if (nameSize > 0) { m_NameBuffer.EnsureCapacity(nameSize + 1); char *buffer = (char *)m_NameBuffer; for (int i = 0; i < nameSize; i++) buffer[i] = ReadByte(); int mainLen; for (mainLen = 0; mainLen < nameSize; mainLen++) if (buffer[mainLen] == '\0') break; buffer[mainLen] = '\0'; item.Name = buffer; if(item.HasUnicodeName()) { if(mainLen < nameSize) { int unicodeNameSizeMax = MyMin(nameSize, (0x400)); _unicodeNameBuffer.EnsureCapacity(unicodeNameSizeMax + 1); DecodeUnicodeFileName(buffer, (const Byte *)buffer + mainLen + 1, nameSize - (mainLen + 1), _unicodeNameBuffer, unicodeNameSizeMax); item.UnicodeName = _unicodeNameBuffer; } else if (!ConvertUTF8ToUnicode(item.Name, item.UnicodeName)) item.UnicodeName.Empty(); } } else item.Name.Empty(); }
HBufC* utf8ToUnicode( const char* utf8 ) { // Length should be right if english and a bit too long if not. HBufC* retVal = HBufC::New( strlen( utf8 ) + 1 ); TPtr retPtr( retVal->Des() ); ConvertUTF8ToUnicode( reinterpret_cast<const unsigned char*>(utf8), retPtr ); return retVal; }
UString CStdInStream::ScanUStringUntilNewLine() { AString s = ScanStringUntilNewLine(true); int codePage = g_CodePage; if (codePage == -1) codePage = CP_OEMCP; UString dest; if (codePage == CP_UTF8) ConvertUTF8ToUnicode(s, dest); else dest = MultiByteToUnicodeString(s, (UINT)codePage); return dest; }
UString MultiByteToUnicodeString(const AString &srcString, UINT codePage) { if ((global_use_utf16_conversion) && (!srcString.IsEmpty())) { UString resultString; bool bret = ConvertUTF8ToUnicode(srcString,resultString); if (bret) return resultString; } UString resultString; for (int i = 0; i < srcString.Len(); i++) resultString += wchar_t(srcString[i] & 255); return resultString; }
UString CSectionInfo::GetMethodName() const { UString s; if (!IsLzx()) { UString temp; if (ConvertUTF8ToUnicode(Name, temp)) s += temp; s += ": "; } FOR_VECTOR (i, Methods) { if (i != 0) s.Add_Space(); s += Methods[i].GetName(); } return s; }
bool ReadNamesFromListFile(CFSTR fileName, UStringVector &strings, UINT codePage) { NWindows::NFile::NIO::CInFile file; if (!file.Open(fileName)) return false; UInt64 fileSize; if (!file.GetLength(fileSize)) return false; if (fileSize >= ((UInt32)1 << 31) - 32) return false; UString u; if (codePage == MY__CP_UTF16 || codePage == MY__CP_UTF16BE) { if ((fileSize & 1) != 0) return false; CByteArr buf((size_t)fileSize); UInt32 processed; if (!file.Read(buf, (UInt32)fileSize, processed)) return false; if (processed != fileSize) return false; file.Close(); unsigned num = (unsigned)fileSize / 2; wchar_t *p = u.GetBuf(num); if (codePage == MY__CP_UTF16) for (unsigned i = 0; i < num; i++) { wchar_t c = GetUi16(buf + i * 2); if (c == 0) return false; p[i] = c; } else for (unsigned i = 0; i < num; i++) { wchar_t c = (wchar_t)GetBe16(buf + i * 2); if (c == 0) return false; p[i] = c; } p[num] = 0; u.ReleaseBuf_SetLen(num); } else { AString s; char *p = s.GetBuf((unsigned)fileSize); UInt32 processed; if (!file.Read(p, (UInt32)fileSize, processed)) return false; if (processed != fileSize) return false; file.Close(); s.ReleaseBuf_CalcLen((unsigned)processed); if (s.Len() != processed) return false; // #ifdef CP_UTF8 if (codePage == CP_UTF8) { if (!ConvertUTF8ToUnicode(s, u)) return false; } else // #endif MultiByteToUnicodeString2(u, s, codePage); } const wchar_t kGoodBOM = 0xFEFF; const wchar_t kBadBOM = 0xFFFE; UString s; unsigned i = 0; for (; i < u.Len() && u[i] == kGoodBOM; i++); for (; i < u.Len(); i++) { wchar_t c = u[i]; if (c == kGoodBOM || c == kBadBOM) return false; if (c == L'\n' || c == 0xD) { AddName(strings, s); s.Empty(); } else s += c; } AddName(strings, s); return true; }
bool CLang::OpenFromString(const AString &s2) { UString s; if (!ConvertUTF8ToUnicode(s2, s)) return false; unsigned i = 0; if (s.IsEmpty()) return false; if (s[0] == 0xFEFF) i++; for (const wchar_t *p = kLangSignature;; i++) { wchar_t c = *p++; if (c == 0) break; if (s[i] != c) return false; } _text = new wchar_t[s.Len() - i + 1]; wchar_t *text = _text; Int32 id = -100; UInt32 pos = 0; while (i < s.Len()) { unsigned start = pos; do { wchar_t c = s[i++]; if (c == '\n') break; if (c == '\\') { if (i == s.Len()) return false; c = s[i++]; switch (c) { case '\n': return false; case 'n': c = '\n'; break; case 't': c = '\t'; break; case '\\': c = '\\'; break; default: text[pos++] = L'\\'; break; } } text[pos++] = c; } while (i < s.Len()); { unsigned j = start; for (; j < pos; j++) if (text[j] != ' ') break; if (j == pos) { id++; continue; } } if (text[start] == ';') { pos = start; id++; continue; } text[pos++] = 0; const wchar_t *end; UInt32 id32 = ConvertStringToUInt32(text + start, &end); if (*end == 0) { if (id32 > ((UInt32)1 << 30) || (Int32)id32 < id) return false; id = (Int32)id32; pos = start; continue; } if (id < 0) return false; _ids.Add((UInt32)id++); _offsets.Add(start); } return true; }