diff --git a/packages/react-native/React/Fabric/RCTConversions.h b/packages/react-native/React/Fabric/RCTConversions.h index 21e6310c62b9..3f742e4071f3 100644 --- a/packages/react-native/React/Fabric/RCTConversions.h +++ b/packages/react-native/React/Fabric/RCTConversions.h @@ -34,7 +34,9 @@ inline NSString *RCTNSStringFromString( const std::string &string, const NSStringEncoding &encoding = NSUTF8StringEncoding) { - return [NSString stringWithCString:string.c_str() encoding:encoding] ?: @""; + return [[NSString alloc] initWithBytes:string.data() + length:string.size() + encoding:encoding] ?: @""; } inline NSString *_Nullable RCTNSStringFromStringNilIfEmpty( @@ -46,7 +48,14 @@ inline NSString *_Nullable RCTNSStringFromStringNilIfEmpty( inline std::string RCTStringFromNSString(NSString *string) { - return std::string{string.UTF8String ?: ""}; + if (!string) { + return ""; + } + NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; + if (!data) { + return ""; + } + return std::string{(const char *)data.bytes, data.length}; } inline UIColor *_Nullable RCTUIColorFromSharedColor(const facebook::react::SharedColor &sharedColor) diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp index 944b59c4f492..cec9eaf5f02d 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/android/ReactCommon/JavaTurboModule.cpp @@ -406,8 +406,10 @@ JNIArgs convertJSIArgsToJNIArgs( throw JavaTurboModuleArgumentConversionException( "string", argIndex, methodName, arg, &rt); } - jarg->l = makeGlobalIfNecessary( - env->NewStringUTF(arg->getString(rt).utf8(rt).c_str())); + auto utf16 = rt.utf16(arg->getString(rt)); + jarg->l = makeGlobalIfNecessary(env->NewString( + reinterpret_cast(utf16.data()), + static_cast(utf16.size()))); } else if (type == "Lcom/facebook/react/bridge/Callback;") { if (!(arg->isObject() && arg->getObject(rt).isFunction(rt))) { throw JavaTurboModuleArgumentConversionException( @@ -785,11 +787,14 @@ jsi::Value JavaTurboModule::invokeJavaMethod( jsi::Value returnValue = jsi::Value::null(); if (returnString != nullptr) { - const char* js = env->GetStringUTFChars(returnString, nullptr); - std::string result = js; - env->ReleaseStringUTFChars(returnString, js); - returnValue = - jsi::Value(runtime, jsi::String::createFromUtf8(runtime, result)); + jsize length = env->GetStringLength(returnString); + const jchar* chars = env->GetStringChars(returnString, nullptr); + auto jsiString = jsi::String::createFromUtf16( + runtime, + reinterpret_cast(chars), + static_cast(length)); + env->ReleaseStringChars(returnString, chars); + returnValue = jsi::Value(runtime, jsiString); } TMPL::syncMethodCallReturnConversionEnd(moduleName, methodName); diff --git a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm index ac0753934520..b38e5e720aa1 100644 --- a/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm +++ b/packages/react-native/ReactCommon/react/nativemodule/core/platform/ios/ReactCommon/RCTTurboModule.mm @@ -143,7 +143,10 @@ size_t size() const override static NSString *convertJSIStringToNSString(jsi::Runtime &runtime, const jsi::String &value) { - return [NSString stringWithUTF8String:value.utf8(runtime).c_str()]; + auto utf8 = value.utf8(runtime); + return [[NSString alloc] initWithBytes:utf8.data() + length:utf8.size() + encoding:NSUTF8StringEncoding] ?: @""; } static NSArray *convertJSIArrayToNSArray( diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm index 346ff459dd27..b0eeed177725 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm @@ -417,7 +417,9 @@ void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) return [[NSMutableAttributedString attributedStringWithAttachment:attachment] mutableCopy]; } else { - NSString *string = [NSString stringWithUTF8String:fragment.string.c_str()]; + NSString *string = [[NSString alloc] initWithBytes:fragment.string.data() + length:fragment.string.size() + encoding:NSUTF8StringEncoding] ?: @""; if (fragment.textAttributes.textTransform.has_value()) { auto textTransform = fragment.textAttributes.textTransform.value(); diff --git a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm index ac9b63e1e5e7..c933e23fcd74 100644 --- a/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +++ b/packages/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm @@ -400,9 +400,12 @@ - (LinesMeasurements)getLinesForAttributedString:(facebook::react::AttributedStr .width = usedRect.size.width, .height = usedRect.size.height}}; CGFloat baseline = [layoutManager locationForGlyphAtIndex:range.location].y; - const char *renderedUTF8 = [renderedString UTF8String]; + NSData *renderedData = + [renderedString dataUsingEncoding:NSUTF8StringEncoding]; auto line = LineMeasurement{ - std::string(renderedUTF8 != nullptr ? renderedUTF8 : ""), + std::string( + renderedData ? (const char *)renderedData.bytes : "", + renderedData ? renderedData.length : 0), rect, overallRect.size.height - baseline, font.capHeight,