Thank you for explanation! 2016-06-03 9:42 GMT+03:00 Jochen Eisinger <joc...@chromium.org>:
> Your input string is encoded as CESU-8, not UTF-8. Older versions of V8 > would silently accept that encoding, however, this leads to broken behavior > when interacting with libraries actually expecting UTF-8, so we changed our > implementation to actually require UTF-8, and invalid characters are > replaced when converting the string to our internal utf-16 representation. > > Roman Budnyjj <budn...@gmail.com> schrieb am Do., 2. Juni 2016, 20:44: > >> Hi guys, >> I'm trying to pass some string data to the JS functions, managed by V8. >> These strings are UTF8-encoded and contain surrogate pairs (Emoji). >> I've found, that for some reason new versions (5.1.281.56) of library >> modify these strings, so >> the contents of strings after conversion to std types back are not the >> same, as it was initially: >> >> #include <include/v8.h> >> >> #include <include/libplatform/libplatform.h> >> >> #include <fcntl.h> >> #include <stdio.h> >> #include <stdlib.h> >> #include <string.h> >> #include <string> >> >> >> class SampleArrayBufferAllocator : public v8::ArrayBuffer::Allocator { >> public: >> virtual void* Allocate(size_t length) { >> void* data = AllocateUninitialized(length); >> return data == NULL ? data : memset(data, 0, length); >> } >> virtual void* AllocateUninitialized(size_t length) { return >> malloc(length); } >> virtual void Free(void* data, size_t) { free(data); } >> }; >> >> int main(int argc, char* argv[]) { >> v8::V8::InitializeICU(); >> v8::V8::InitializeExternalStartupData(argv[0]); >> v8::Platform* platform = v8::platform::CreateDefaultPlatform(); >> v8::V8::InitializePlatform(platform); >> v8::V8::Initialize(); >> v8::V8::SetFlagsFromCommandLine(&argc, argv, true); >> SampleArrayBufferAllocator array_buffer_allocator; >> v8::Isolate::CreateParams create_params; >> create_params.array_buffer_allocator = &array_buffer_allocator; >> v8::Isolate* isolate = v8::Isolate::New(create_params); >> { >> v8::Isolate::Scope isolate_scope(isolate); >> v8::HandleScope handle_scope(isolate); >> // v8::Local<v8::Context> context = CreateShellContext(isolate); >> >> // \uD83C\uDC32\ >> std::string src("\355\240\274\355\260\262"); >> std::string dst = >> *v8::String::Utf8Value( >> v8::String::NewFromUtf8( >> isolate, src.c_str(), >> v8::NewStringType::kNormal).ToLocalChecked()); >> if (src != dst) { >> printf("!\n"); >> } >> } >> >> return 0; >> } >> >> Both on my x64 machine and android-19 (ARM) it prints "!". >> I also want to mention, that on older versions of V8 (3.27.34) this >> string stays unmodified. >> Could you please describe the reasons of such behavior? >> >> -- >> -- >> v8-users mailing list >> v8-users@googlegroups.com >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to v8-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- > -- > v8-users mailing list > v8-users@googlegroups.com > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to a topic in the > Google Groups "v8-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/v8-users/c01n8mxAqTQ/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.