String String::fromUTF8(const LChar* stringStart, size_t length) { RELEASE_ASSERT(length <= std::numeric_limits<unsigned>::max()); if (!stringStart) return String(); if (!length) return emptyString(); if (charactersAreAllASCII(stringStart, length)) return StringImpl::create(stringStart, length); Vector<UChar, 1024> buffer(length); UChar* bufferStart = buffer.data(); UChar* bufferCurrent = bufferStart; const char* stringCurrent = reinterpret_cast<const char*>(stringStart); if (convertUTF8ToUTF16(&stringCurrent, reinterpret_cast<const char *>(stringStart + length), &bufferCurrent, bufferCurrent + buffer.size()) != conversionOK) return String(); unsigned utf16Length = bufferCurrent - bufferStart; ASSERT(utf16Length < length); return StringImpl::create(bufferStart, utf16Length); }
String String::fromUTF8(const char* stringStart, size_t length) { if (!stringStart) return String(); // We'll use a StringImpl as a buffer; if the source string only contains ascii this should be // the right length, if there are any multi-byte sequences this buffer will be too large. UChar* buffer; String stringBuffer(StringImpl::createUninitialized(length, buffer)); UChar* bufferEnd = buffer + length; // Try converting into the buffer. const char* stringCurrent = stringStart; if (convertUTF8ToUTF16(&stringCurrent, stringStart + length, &buffer, bufferEnd) != conversionOK) return String(); // stringBuffer is full (the input must have been all ascii) so just return it! if (buffer == bufferEnd) return stringBuffer; // stringBuffer served its purpose as a buffer, copy the contents out into a new string. unsigned utf16Length = buffer - stringBuffer.characters(); ASSERT(utf16Length < length); return String(stringBuffer.characters(), utf16Length); }
Identifier identifierFromNPIdentifier(const NPUTF8* name) { NPUTF16 *methodName; unsigned UTF16Length; convertUTF8ToUTF16(name, -1, &methodName, &UTF16Length); // requires free() of returned memory. Identifier identifier((const KJS::UChar*)methodName, UTF16Length); free(methodName); return identifier; }
UString UString::createFromUTF8(const char* string) { if (!string) return null(); size_t length = strlen(string); Vector<UChar, 1024> buffer(length); UChar* p = buffer.data(); if (conversionOK != convertUTF8ToUTF16(&string, string + length, &p, p + length)) return null(); return UString(buffer.data(), p - buffer.data()); }
String16 String16::fromUTF8(const char* stringStart, size_t length) { if (!stringStart || !length) return String16(); std::vector<UChar> buffer(length); UChar* bufferStart = buffer.data(); UChar* bufferCurrent = bufferStart; const char* stringCurrent = stringStart; if (convertUTF8ToUTF16(&stringCurrent, stringStart + length, &bufferCurrent, bufferCurrent + buffer.size(), 0, true) != conversionOK) return String16(); unsigned utf16Length = bufferCurrent - bufferStart; return String16(bufferStart, utf16Length); }
// Requires free() of returned UTF16Chars. void convertNPStringToUTF16(const NPString *string, NPUTF16 **UTF16Chars, unsigned int *UTF16Length) { convertUTF8ToUTF16(string->UTF8Characters, string->UTF8Length, UTF16Chars, UTF16Length); }
inline Local<String> MakeAnything(ThingToMake<String>, JNIEnv& env, const std::string& string) { return Make<String>(env, convertUTF8ToUTF16(string)); }