1# 使用JSVM-API接口创建和获取string值 2<!--Kit: NDK Development--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @yuanxiaogou; @string_sz--> 5<!--Designer: @knightaoko--> 6<!--Tester: @test_lzz--> 7<!--Adviser: @fang-jinxu--> 8 9## 简介 10 11使用JSVM-API的六个字符串接口,可以实现JSVM模块与JavaScript字符串的交互功能。 12 13## 基本概念 14 15string是编程中常用的数据类型。用于存储和操作文本数据,它可用于构建用户界面元素,如标签、按钮和文本框,处理用户输入,验证和格式化数据。不同的编码方案支持不同的字符集和语言,以下是一些主要的编码方案及其区别: 16 17- **ASCII**:ASCII是最早的字符编码方案之一,使用7位编码,只能表示英文字母、数字和一些基本符号。它是许多其他编码方案的基础。 18- **UTF-8**:UTF-8是一种变长编码方案,可以表示全球范围的字符集。它使用8位编码,根据字符的不同范围使用不同长度的字节序列。UTF-8是互联网上广泛使用的编码方案。 19- **UTF-16**:UTF-16是一种定长或变长编码方案,使用16位编码。它可以表示全球范围的字符集,并且适用于较大的字符集。 20- **ISO-8859-1(Latin-1)**:ISO-8859-1是一种单字节编码方案,使用8位编码。它主要用于表示拉丁字母字符集,包括欧洲大部分语言。 21 22## 接口说明 23 24| 接口 | 功能说明 | 25|----------------------------|--------------------------------| 26| OH_JSVM_GetValueStringUtf8 | 获取给定JavaScript string对象的Utf8编码字符串。| 27| OH_JSVM_CreateStringUtf8 | 根据Utf8编码的字符串创建一个JavaScript string对象。| 28| OH_JSVM_GetValueStringUtf16 | 获取给定JavaScript string对象的Utf16编码字符串。| 29| OH_JSVM_CreateStringUtf16 | 根据Utf16编码的字符串数据创建JavaScript string对象。| 30| OH_JSVM_GetValueStringLatin1 | 获取给定JavaScript string对象的Latin-1编码字符串。| 31| OH_JSVM_CreateStringLatin1 | 根据Latin-1编码的字符串创建一个JavaScript string对象。| 32 33## 使用示例 34 35JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md)。本文仅展示接口对应的C++相关代码。 36 37### OH_JSVM_GetValueStringUtf8 38 39OH_JSVM_GetValueStringUtf8接口可以将JavaScript的字符类型的数据转换为utf8编码的字符。 40 41cpp部分代码: 42 43```cpp 44// hello.cpp 45#include "napi/native_api.h" 46#include "ark_runtime/jsvm.h" 47#include <hilog/log.h> 48#include <cstdlib> 49// OH_JSVM_GetValueStringUtf8的样例方法 50static JSVM_Value GetValueStringUtf8(JSVM_Env env, JSVM_CallbackInfo info) 51{ 52 size_t argc = 1; 53 JSVM_Value args[1] = {nullptr}; 54 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 55 size_t length = 0; 56 JSVM_Status status = OH_JSVM_GetValueStringUtf8(env, args[0], nullptr, 0, &length); 57 char *buf = (char *)malloc(length + 1); 58 if (buf == nullptr) { 59 OH_LOG_ERROR(LOG_APP, "malloc failed"); 60 return nullptr; 61 } 62 memset(buf, 0, length + 1); 63 status = OH_JSVM_GetValueStringUtf8(env, args[0], buf, length + 1, &length); 64 if (status != JSVM_OK) { 65 OH_LOG_ERROR(LOG_APP, "JSVM GetValueStringUtf8 fail"); 66 free(buf); 67 return nullptr; 68 } else { 69 OH_LOG_INFO(LOG_APP, "JSVM GetValueStringUtf8 success: %{public}s", buf); 70 } 71 JSVM_Value result = nullptr; 72 OH_JSVM_CreateStringUtf8(env, buf, length, &result); 73 free(buf); 74 return result; 75} 76// GetValueStringUtf8注册回调 77static JSVM_CallbackStruct param[] = { 78 {.data = nullptr, .callback = GetValueStringUtf8}, 79}; 80static JSVM_CallbackStruct *method = param; 81// GetValueStringUtf8方法别名,供JS调用 82static JSVM_PropertyDescriptor descriptor[] = { 83 {"getValueStringUtf8", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 84}; 85 86// 样例测试js 87const char *srcCallNative = R"JS( 88 let data = "aaBC+-$%^你好123"; 89 let script = getValueStringUtf8(data); 90)JS"; 91``` 92<!-- @[oh_jsvm_get_value_string_utf8](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/getvaluestringutf8/src/main/cpp/hello.cpp) --> 93 94预期输出结果: 95```cpp 96JSVM GetValueStringUtf8 success: aaBC+-$%^你好123 97``` 98**注意事项**:`getValueStringUtf8(arg)`入参`arg`非字符串型数据时接口会调用失败。 99 100### OH_JSVM_CreateStringUtf8 101 102用于创建一个UTF-8编码的JavaScript字符串。 103 104cpp部分代码: 105 106```cpp 107// hello.cpp 108#include "napi/native_api.h" 109#include "ark_runtime/jsvm.h" 110#include <hilog/log.h> 111#include <string> 112// OH_JSVM_CreateStringUtf8的样例方法 113static JSVM_Value CreateStringUtf8(JSVM_Env env, JSVM_CallbackInfo info) 114{ 115 const char *str = u8"你好, World!, successes to create UTF-8 string!"; 116 size_t length = strlen(str); 117 JSVM_Value result = nullptr; 118 JSVM_Status status = OH_JSVM_CreateStringUtf8(env, str, length, &result); 119 if (status != JSVM_OK) { 120 OH_JSVM_ThrowError(env, nullptr, "Failed to create UTF-8 string"); 121 return nullptr; 122 } else { 123 OH_LOG_INFO(LOG_APP, "JSVM CreateStringUtf8 success: %{public}s", str); 124 } 125 return result; 126} 127// CreateStringUtf8注册回调 128static JSVM_CallbackStruct param[] = { 129 {.data = nullptr, .callback = CreateStringUtf8}, 130}; 131static JSVM_CallbackStruct *method = param; 132// CreateStringUtf8方法别名,供JS调用 133static JSVM_PropertyDescriptor descriptor[] = { 134 {"createStringUtf8", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 135}; 136 137// 样例测试js 138const char *srcCallNative = R"JS( 139 let script = createStringUtf8(); 140)JS"; 141``` 142<!-- @[oh_jsvm_create_string_utf8](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/createstringutf8/src/main/cpp/hello.cpp) --> 143 144预期输出结果: 145```cpp 146JSVM CreateStringUtf8 success: 你好, World!, successes to create UTF-8 string! 147``` 148### OH_JSVM_GetValueStringUtf16 149 150OH_JSVM_GetValueStringUtf16,将JavaScript的字符类型的数据转换为utf16编码的字符。 151 152cpp部分代码: 153 154```cpp 155// hello.cpp 156#include "napi/native_api.h" 157#include "ark_runtime/jsvm.h" 158#include <hilog/log.h> 159#include <codecvt> 160#include <locale> 161#include <cstdlib> 162 163// OH_JSVM_GetValueStringUtf16的样例方法 164// 定义字符串缓冲区的最大长度 165static const int MAX_BUFFER_SIZE = 128; 166static JSVM_Value GetValueStringUtf16(JSVM_Env env, JSVM_CallbackInfo info) { 167 size_t argc = 1; 168 JSVM_Value args[1] = {nullptr}; 169 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 170 JSVM_Value result = nullptr; 171 size_t length = 0; 172 char16_t buffer[MAX_BUFFER_SIZE] = {0}; 173 // 字符串的缓冲区大小 174 size_t bufferSize = MAX_BUFFER_SIZE; 175 JSVM_Status status = OH_JSVM_GetValueStringUtf16(env, args[0], buffer, bufferSize, &length); 176 // 将 char16_t 转换为 std::u16string 177 std::u16string u16str = {buffer}; 178 // 将 std::u16string 转换为 std::string 179 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; 180 std::string str = converter.to_bytes(u16str); 181 // 获取字符串返回结果 182 if (status != JSVM_OK) { 183 OH_LOG_ERROR(LOG_APP, "JSVM GetValueStringUtf16 fail"); 184 return nullptr; 185 } else { 186 OH_LOG_INFO(LOG_APP, "JSVM GetValueStringUtf16 success: %{public}s", str.c_str()); 187 } 188 return result; 189} 190// GetValueStringUtf16注册回调 191static JSVM_CallbackStruct param[] = { 192 {.data = nullptr, .callback = GetValueStringUtf16}, 193}; 194static JSVM_CallbackStruct *method = param; 195// GetValueStringUtf16方法别名,供JS调用 196static JSVM_PropertyDescriptor descriptor[] = { 197 {"getValueStringUtf16", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 198}; 199 200// 样例测试js 201const char *srcCallNative = R"JS( 202 let data = "ahello。"; 203 let script = getValueStringUtf16(data); 204)JS"; 205``` 206<!-- @[oh_jsvm_get_value_string_utf16](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/getvaluestringutf16/src/main/cpp/hello.cpp) --> 207 208预期输出结果: 209```cpp 210JSVM GetValueStringUtf16 success: ahello。 211``` 212**注意事项**:`getValueStringUtf16(arg)`的参数`arg`必须是字符串,否则接口会调用失败。 213 214### OH_JSVM_CreateStringUtf16 215 216用于创建一个UTF-16编码的JavaScript字符串。 217 218cpp部分代码: 219 220```cpp 221// hello.cpp 222#include "napi/native_api.h" 223#include "ark_runtime/jsvm.h" 224#include <hilog/log.h> 225#include <codecvt> 226#include <locale> 227#include <cstring> 228 229// OH_JSVM_CreateStringUtf16的样例方法 230static JSVM_Value CreateStringUtf16(JSVM_Env env, JSVM_CallbackInfo info) 231{ 232 const char16_t *str = u"你好, World!, successes to create UTF-16 string!"; 233 std::u16string ustr(str); 234 size_t length = ustr.length(); 235 JSVM_Value result = nullptr; 236 JSVM_Status status = OH_JSVM_CreateStringUtf16(env, str, length, &result); 237 std::u16string u16str = {str}; 238 // 将 std::u16string 转换为 std::string 239 std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> converter; 240 std::string strResult = converter.to_bytes(u16str); 241 if (status != JSVM_OK) { 242 OH_LOG_ERROR(LOG_APP, "JSVM CreateStringUtf16 fail"); 243 }else { 244 OH_LOG_INFO(LOG_APP, "JSVM CreateStringUtf16 success: %{public}s", strResult.c_str()); 245 } 246 return result; 247} 248// CreateStringUtf16注册回调 249static JSVM_CallbackStruct param[] = { 250 {.data = nullptr, .callback = CreateStringUtf16}, 251}; 252static JSVM_CallbackStruct *method = param; 253// CreateStringUtf16方法别名,供JS调用 254static JSVM_PropertyDescriptor descriptor[] = { 255 {"createStringUtf16", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 256}; 257 258// 样例测试js 259const char *srcCallNative = R"JS( 260 let script = createStringUtf16(); 261)JS"; 262``` 263<!-- @[oh_jsvm_create_string_utf16](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/createstringutf16/src/main/cpp/hello.cpp) --> 264 265预期输出结果: 266```cpp 267JSVM CreateStringUtf16 success: 你好, World!, successes to create UTF-16 string! 268``` 269### OH_JSVM_GetValueStringLatin1 270 271OH_JSVM_GetValueStringLatin1接口可以将JavaScript的字符类型的数据转换为ISO-8859-1编码的字符。 272 273cpp部分代码: 274 275```cpp 276// hello.cpp 277#include "napi/native_api.h" 278#include "ark_runtime/jsvm.h" 279#include <hilog/log.h> 280#include <cstdlib> 281// OH_JSVM_GetValueStringLatin1的样例方法 282// 定义字符串缓冲区的最大长度 283static const int MAX_BUFFER_SIZE = 128; 284static JSVM_Value GetValueStringLatin1(JSVM_Env env, JSVM_CallbackInfo info) 285{ 286 size_t argc = 1; 287 JSVM_Value args[1] = {nullptr}; 288 OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr); 289 char buf[MAX_BUFFER_SIZE]; 290 size_t length = 0; 291 JSVM_Value jsvmRes = nullptr; 292 JSVM_Status status = OH_JSVM_GetValueStringLatin1(env, args[0], buf, MAX_BUFFER_SIZE, &length); 293 if (status != JSVM_OK) { 294 OH_LOG_ERROR(LOG_APP, "JSVM GetValueStringLatin1 fail"); 295 } else { 296 OH_LOG_INFO(LOG_APP, "JSVM GetValueStringLatin1 success: %{public}s", buf); 297 } 298 OH_JSVM_CreateStringLatin1(env, buf, length, &jsvmRes); 299 return jsvmRes; 300} 301// GetValueStringLatin1注册回调 302static JSVM_CallbackStruct param[] = { 303 {.data = nullptr, .callback = GetValueStringLatin1}, 304}; 305static JSVM_CallbackStruct *method = param; 306// GetValueStringLatin1方法别名,供JS调用 307static JSVM_PropertyDescriptor descriptor[] = { 308 {"getValueStringLatin1", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 309}; 310 311// 样例测试js 312const char *srcCallNative = R"JS( 313 let data = "中文"; 314 let script = getValueStringLatin1(data); 315)JS"; 316``` 317<!-- @[oh_jsvm_get_value_string_latin1](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/getvaluestringlatin1/src/main/cpp/hello.cpp) --> 318 319预期输出结果(ISO-8859-1编码不支持中文,传入中文字符会导致乱码): 320 321 322 323**注意事项**:`getValueStringLatin1(arg)`入参`arg`必须为字符串类型,否则接口调用会失败。 324 325### OH_JSVM_CreateStringLatin1 326 327用于创建一个Latin1编码的JavaScript字符串。 328 329cpp部分代码: 330 331```cpp 332// hello.cpp 333#include "napi/native_api.h" 334#include "ark_runtime/jsvm.h" 335#include <hilog/log.h> 336#include <cstring> 337// CreateStringLatin1注册回调 338// 定义字符串缓冲区的最大长度 339static const int MAX_BUFFER_SIZE = 128; 340// OH_JSVM_CreateStringLatin1的样例方法 341static JSVM_Value CreateStringLatin1(JSVM_Env env, JSVM_CallbackInfo info) 342{ 343 const char *str = "Hello, World! éçñ, successes to create Latin1 string!"; 344 size_t length = JSVM_AUTO_LENGTH; 345 JSVM_Value result = nullptr; 346 JSVM_Status status = OH_JSVM_CreateStringLatin1(env, str, length, &result); 347 if (status != JSVM_OK) { 348 OH_LOG_ERROR(LOG_APP, "JSVM CreateStringLatin1 fail"); 349 } else { 350 char buf[MAX_BUFFER_SIZE]; 351 size_t length = 0; 352 OH_JSVM_GetValueStringLatin1(env, result, buf, MAX_BUFFER_SIZE, &length); 353 OH_LOG_INFO(LOG_APP, "JSVM CreateStringLatin1 success: %{public}s", buf); 354 } 355 return result; 356} 357static JSVM_CallbackStruct param[] = { 358 {.data = nullptr, .callback = CreateStringLatin1}, 359}; 360static JSVM_CallbackStruct *method = param; 361// CreateStringLatin1方法别名,供JS调用 362static JSVM_PropertyDescriptor descriptor[] = { 363 {"createStringLatin1", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT}, 364}; 365 366// 样例测试js 367const char *srcCallNative = R"JS( 368 let script = createStringLatin1(); 369)JS"; 370``` 371<!-- @[oh_jsvm_create_string_latin1](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/JSVMAPI/JsvmUsageGuide/JsvmAboutString/createstringlatin1/src/main/cpp/hello.cpp) --> 372 373预期输出结果: 374```cpp 375JSVM CreateStringLatin1 success: Hello, World! éçñ, successes to create Latin1 string! 376```