From 5f5d59528c91a634affc941813be3e7aa55e9ea5 Mon Sep 17 00:00:00 2001 From: hanyuqing Date: Thu, 19 Jun 2025 18:10:44 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=96=B0=E9=9C=80=E6=B1=82]:=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96TextEncoder=E6=A8=A1=E5=9D=97=E7=9A=84encodeInto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit issue: https://gitee.com/openharmony/commonlibrary_ets_utils/issues/ICGFON Signed-off-by: hanyuqing --- platform/ohos/util_helper.cpp | 114 +++++++++++++++++----------------- platform/util_helper.h | 1 + 2 files changed, 58 insertions(+), 57 deletions(-) diff --git a/platform/ohos/util_helper.cpp b/platform/ohos/util_helper.cpp index 5e1f6013..0e986469 100644 --- a/platform/ohos/util_helper.cpp +++ b/platform/ohos/util_helper.cpp @@ -68,18 +68,9 @@ namespace Commonlibrary::Platform { size_t maxByteSize = static_cast(ucnv_getMaxCharSize(converter)); const UChar *source = originalBuffer; size_t limit = maxByteSize * inputSize; - size_t len = limit * sizeof(char); - char *targetArray = nullptr; - if (limit > 0) { - targetArray = new char[limit + 1]; - if (memset_s(targetArray, len + sizeof(char), 0, len + sizeof(char)) != EOK) { - HILOG_ERROR("textencoder::encode targetArray memset_s failed"); - ucnv_close(converter); - FreedMemory(targetArray); - return ""; - } - } else { - HILOG_ERROR("textencoder::limit is error"); + char *targetArray = new (std::nothrow) char[limit + 1] {0}; + if (targetArray == nullptr) { + HILOG_ERROR("TextEncoder:: memory allocation failed!"); ucnv_close(converter); return ""; } @@ -88,12 +79,12 @@ namespace Commonlibrary::Platform { const char *targetLimit = targetArray + limit; const UChar *sourceLimit = source + u_strlen(source); if (sourceLimit == nullptr) { - HILOG_ERROR("textencoder::sourceLimit is nullptr"); + HILOG_ERROR("TextEncoder:: sourceLimit is nullptr"); return ""; } ucnv_fromUnicode(converter, &target, targetLimit, &source, sourceLimit, nullptr, true, &codeflag); if (U_FAILURE(codeflag)) { - HILOG_ERROR("textencoder::ucnv_fromUnicode conversion failed."); + HILOG_ERROR("TextEncoder:: conversion failed."); ucnv_close(converter); FreedMemory(targetArray); return ""; @@ -114,6 +105,47 @@ namespace Commonlibrary::Platform { } } + char* FastUnicodeConversion(std::string encoding, char16_t* originalBuffer, size_t inputSize, size_t& encodingSize) + { + UErrorCode codeflag = U_ZERO_ERROR; + UConverter* converter = ucnv_open(encoding.c_str(), &codeflag); + if (U_FAILURE(codeflag)) { + HILOG_ERROR("TextEncoder:: ucnv_open failed !"); + return nullptr; + } + + size_t maxByteSize = static_cast(ucnv_getMaxCharSize(converter)); + const UChar* source = originalBuffer; + size_t limit = maxByteSize * inputSize; + char* targetArray = new (std::nothrow) char[limit + 1] {0}; + if (targetArray == nullptr) { + HILOG_ERROR("TextEncoder:: memory allocation failed!"); + ucnv_close(converter); + return nullptr; + } + + char* target = targetArray; + const char* targetLimit = targetArray + limit; + + // inputSize: the length of the complete input. + const UChar* sourceLimit = source + inputSize; + if (sourceLimit == nullptr) { + HILOG_ERROR("TextEncoder:: sourceLimit is nullptr"); + FreedMemory(targetArray); + return nullptr; + } + ucnv_fromUnicode(converter, &target, targetLimit, &source, sourceLimit, nullptr, true, &codeflag); + if (U_FAILURE(codeflag)) { + HILOG_ERROR("TextEncoder:: conversion failed!"); + ucnv_close(converter); + FreedMemory(targetArray); + return nullptr; + } + encodingSize = target - targetArray; + ucnv_close(converter); + return targetArray; + } + void EncodeConversion(napi_env env, napi_value src, napi_value* arrayBuffer, size_t &outLens, std::string encoding) { if (encoding == "utf-16le") { @@ -250,7 +282,7 @@ namespace Commonlibrary::Platform { napi_get_value_string_utf16(env, src, nullptr, 0, &inputSize); char16_t *originalBuffer = ApplyMemory(inputSize); if (originalBuffer == nullptr) { - HILOG_ERROR("textencoder::originalBuffer is nullptr"); + HILOG_ERROR("TextEncoder:: memory allocation failed for original data!"); return; } napi_get_value_string_utf16(env, src, originalBuffer, inputSize + 1, &inputSize); @@ -259,49 +291,17 @@ namespace Commonlibrary::Platform { char *writeResult = static_cast(data); if (writeResult == nullptr) { FreedMemory(originalBuffer); - HILOG_ERROR("textencoder::writeResult is nullptr"); + HILOG_ERROR("TextEncoder:: writeResult is nullptr"); return; } - std::string buffer = ""; - std::u16string originalStr(originalBuffer, inputSize); - size_t shifting = 0; - size_t resultShifting = 0; - size_t findIndex = originalStr.find('\0'); - if (findIndex == std::string::npos) { - buffer = UnicodeConversion(encoding, originalBuffer, inputSize); - outLens = buffer.length(); - if (memcpy_s(writeResult, outLens, reinterpret_cast(buffer.data()), outLens) != EOK) { - FreedMemory(originalBuffer); - HILOG_FATAL("textencoder::copy buffer to arraybuffer error"); - return; - } - } else { - while (findIndex != std::string::npos) { - buffer = UnicodeConversion(encoding, originalBuffer + shifting, inputSize); - if (memcpy_s(writeResult + resultShifting, buffer.length(), - reinterpret_cast(buffer.data()), buffer.length()) != EOK) { - FreedMemory(originalBuffer); - HILOG_FATAL("textencoder::copy buffer to arraybuffer error"); - return; - } - resultShifting += buffer.length(); - *(writeResult + resultShifting) = '\0'; - resultShifting += 1; - outLens += buffer.length() + 1; - shifting += findIndex + 1; - originalStr = originalStr.substr(findIndex + 1, inputSize); - findIndex = originalStr.find('\0'); - } - buffer = UnicodeConversion(encoding, originalBuffer + shifting, inputSize); - outLens += buffer.length(); - if (memcpy_s(writeResult + resultShifting, buffer.length(), - reinterpret_cast(buffer.data()), buffer.length()) != EOK) { - FreedMemory(originalBuffer); - HILOG_FATAL("textencoder::copy buffer to arraybuffer error"); - return; - } + + char* result = FastUnicodeConversion(encoding, originalBuffer, inputSize, outLens); + if (memcpy_s(writeResult, outLens, result, outLens) != EOK) { + FreedMemory(originalBuffer); + HILOG_FATAL("TextEncoder:: memcpy failed!"); + return; } - FreedMemory(originalBuffer); + FreedMemory(result); } std::u16string EncodeUtf16BE(napi_env env, napi_value src) @@ -310,12 +310,12 @@ namespace Commonlibrary::Platform { 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"); + HILOG_ERROR("TextEncoder:: Get string size failed!"); return u""; } buffer.resize(bufferSize); if (napi_get_value_string_utf8(env, src, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { - HILOG_ERROR("textencoder::can not get src value"); + HILOG_ERROR("TextEncoder:: Get string failed!"); return u""; } std::u16string u16Str = Utf8ToUtf16BE(buffer); diff --git a/platform/util_helper.h b/platform/util_helper.h index 9d310ee7..e42575ea 100644 --- a/platform/util_helper.h +++ b/platform/util_helper.h @@ -78,6 +78,7 @@ namespace Commonlibrary::Platform { std::string ConvertToString(UChar* uchar, size_t length); void EncodeIntoChinese(napi_env env, napi_value src, std::string encoding, std::string& buffer); std::string UnicodeConversion(std::string encoding, char16_t* originalBuffer, size_t inputSize); + char* UnicodeConversion(std::string encoding, char16_t* originalBuffer, size_t inputSize, size_t &encodingSize); void EncodeToUtf8(TextEcodeInfo encodeInfo, char* writeResult, uint32_t* written, size_t length, int32_t* nchars); void EncodeConversion(napi_env env, napi_value src, napi_value* arrayBuffer, size_t &outLens, std::string encoding); -- Gitee