diff --git a/js_util_module/util/js_textencoder.cpp b/js_util_module/util/js_textencoder.cpp index 1b0e5f7555fcb733141f1d2b19c684f409d34015..b5c4ed42c4c6b93da444edd87d11d567a76bb101 100644 --- a/js_util_module/util/js_textencoder.cpp +++ b/js_util_module/util/js_textencoder.cpp @@ -25,7 +25,7 @@ namespace OHOS::Util { napi_value TextEncoder::GetEncoding(napi_env env) const { napi_value result = nullptr; - NAPI_CALL(env, napi_create_string_utf8(env, encoding_.c_str(), encoding_.length(), &result)); + NAPI_CALL(env, napi_create_string_utf8(env, orgEncoding_.c_str(), orgEncoding_.length(), &result)); return result; } @@ -37,7 +37,7 @@ namespace OHOS::Util { size_t outLens = 0; void *data = nullptr; napi_value arrayBuffer = nullptr; - if (encoding_ == "utf-8" || encoding_ == "UTF-8") { + if (encoding_ == "utf-8") { size_t bufferSize = 0; if (napi_get_value_string_utf8(env, src, nullptr, 0, &bufferSize) != napi_ok) { HILOG_ERROR("textencoder::can not get src size"); diff --git a/js_util_module/util/js_textencoder.h b/js_util_module/util/js_textencoder.h index 85635d52b1e89f0b09d1838ffe9f94367e4c3bf7..d3b7967952d520c616bbef09d7e67911624d66ba 100644 --- a/js_util_module/util/js_textencoder.h +++ b/js_util_module/util/js_textencoder.h @@ -20,9 +20,12 @@ #include "napi/native_api.h" #include "napi/native_node_api.h" +#include "native_engine.h" #include "unicode/ucnv.h" namespace OHOS::Util { + constexpr const int32_t API_VERSION_MOD = 100; // 100: api version mod + constexpr const int32_t API13 = 13; // 13: api version class TextEncoder { public: /** @@ -61,8 +64,27 @@ namespace OHOS::Util { */ napi_value EncodeInto(napi_env env, napi_value src, napi_value dest) const; + void SetOrgEncoding(std::string orgEncoding) + { + orgEncoding_ = orgEncoding; + } + + void SetApiIsolated(napi_env env) + { + if (encoding_ != "utf-16be" && encoding_ != "utf-16le") { + return; + } + NativeEngine* engine = reinterpret_cast(env); + if (engine != nullptr) { + int32_t currentApi = engine->GetApiVersion() % API_VERSION_MOD; + if (currentApi >= API13) { + encoding_ = encoding_ == "utf-16be" ? "utf-16le" : "utf-16be"; + } + } + } private: std::string encoding_ {}; + std::string orgEncoding_ {}; }; } #endif // UTIL_JS_TEXTENCODER_H diff --git a/js_util_module/util/native_module_util.cpp b/js_util_module/util/native_module_util.cpp index fcf211471cd17ff8ee1568268288a3efc2dac52f..cb873cb0b5c82e10fc1ba2f9cc2ed75da528af14 100644 --- a/js_util_module/util/native_module_util.cpp +++ b/js_util_module/util/native_module_util.cpp @@ -592,7 +592,8 @@ namespace OHOS::Util { napi_value thisVar = nullptr; napi_value src = nullptr; napi_get_cb_info(env, info, &argc, &src, &thisVar, nullptr); - std::string enconding = "utf-8"; + std::string encoding = "utf-8"; + std::string orgEncoding = encoding; if (argc == 1) { napi_get_cb_info(env, info, &argc, &src, nullptr, nullptr); napi_valuetype valuetype; @@ -611,12 +612,18 @@ namespace OHOS::Util { HILOG_ERROR("can not get src value"); return nullptr; } + orgEncoding = buffer; + for (char &temp : buffer) { + temp = std::tolower(static_cast(temp)); + } NAPI_ASSERT(env, CheckEncodingFormat(buffer), "Wrong encoding format, the current encoding format is not support"); - enconding = buffer; + encoding = buffer; } } - auto object = new TextEncoder(enconding); + auto object = new TextEncoder(encoding); + object->SetOrgEncoding(orgEncoding); + object->SetApiIsolated(env); napi_wrap( env, thisVar, object, [](napi_env environment, void *data, void *hint) { diff --git a/js_util_module/util/test/test_util.cpp b/js_util_module/util/test/test_util.cpp index e6d9174ced4f4e081717819fc988ac777bbe520a..45bf61a104deb5eba0f94994b0174b6962ef053a 100644 --- a/js_util_module/util/test/test_util.cpp +++ b/js_util_module/util/test/test_util.cpp @@ -165,6 +165,7 @@ HWTEST_F(NativeEngineTest, getEncodingTest001, testing::ext::TestSize.Level0) napi_env env = (napi_env)engine_; OHOS::Util::TextEncoder textEncoder("GBK"); + textEncoder.SetOrgEncoding("GBK"); napi_value result = textEncoder.GetEncoding(env); char *buffer = nullptr; @@ -192,6 +193,7 @@ HWTEST_F(NativeEngineTest, getEncodingTest002, testing::ext::TestSize.Level0) napi_env env = (napi_env)engine_; OHOS::Util::TextEncoder textEncoder("gb18030"); + textEncoder.SetOrgEncoding("gb18030"); napi_value result = textEncoder.GetEncoding(env); char *buffer = nullptr; @@ -219,6 +221,7 @@ HWTEST_F(NativeEngineTest, getEncodingTest003, testing::ext::TestSize.Level0) napi_env env = (napi_env)engine_; OHOS::Util::TextEncoder textEncoder("GB18030"); + textEncoder.SetOrgEncoding("GB18030"); napi_value result = textEncoder.GetEncoding(env); char *buffer = nullptr;