From 911efe0adeef0993ed2b16a1a88fae75cb439f38 Mon Sep 17 00:00:00 2001 From: yujiace Date: Mon, 24 Mar 2025 15:39:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=92=E5=BA=8F=E4=BF=AE=E6=94=B9=20Signed-o?= =?UTF-8?q?ff-by:=20yujiace=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I668472c0cfccef1def55722a2c2643ef29e61589 --- BUILD.gn | 10 ++++++- ability/common/include/common.h | 6 ++++ .../include/character_transliterate.h | 5 ++++ .../src/character_transliterate.cpp | 29 ++++++++++++++----- bundle.json | 3 +- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/BUILD.gn b/BUILD.gn index 18fc609..058acee 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -119,9 +119,17 @@ ohos_shared_library("contactsdataability") { "//base/account/os_account/interfaces/innerkits/include", "//foundation/ability/ability_runtime/interfaces/inner_api/ability_manager/include", "//foundation/ability/ability_runtime/interfaces/kits/native/ability/native", + "//third_party/icu/icu4c/source", + "//third_party/icu/icu4c/source/common", + "//third_party/icu/icu4c/source/i18n", + "//third_party/icu/icu4c/source/common/unicode", ] - deps = [ "//third_party/jsoncpp:jsoncpp" ] + deps = [ + "//third_party/icu/icu4c:shared_icui18n", + "//third_party/icu/icu4c:shared_icuuc", + "//third_party/jsoncpp:jsoncpp", + ] public_configs = [ ":contactsdataability_public_config" ] external_deps = [ diff --git a/ability/common/include/common.h b/ability/common/include/common.h index eea98ad..10a48b1 100644 --- a/ability/common/include/common.h +++ b/ability/common/include/common.h @@ -123,6 +123,12 @@ constexpr const char *CONTACT_URI = "datashare:///com.ohos.contactsdataability"; constexpr const char *VOICEMAIL_URI = "datashare:///com.ohos.voicemailability"; constexpr const char *CALL_LOG_URI = "datashare:///com.ohos.calllogability"; +constexpr const char *ANONYMOUS_SORT_FIRST_LETTER = "..."; +constexpr const char *ANONYMOUS_SORT = "99"; + +constexpr const char *LATIN_TO_ASCII_ICU_TRANSLITE_ID = "Latin-Ascii"; +constexpr const char *HANZI_TO_PINYIN_ICU_TRANSLITE_ID = "Han-Latin/Names; Latin-Ascii"; + constexpr const char *CREATE_CALLLOG = "CREATE TABLE IF NOT EXISTS [calllog](" "[id] INTEGER PRIMARY KEY AUTOINCREMENT, " diff --git a/ability/sinicization/include/character_transliterate.h b/ability/sinicization/include/character_transliterate.h index 7cd8965..b461cdf 100644 --- a/ability/sinicization/include/character_transliterate.h +++ b/ability/sinicization/include/character_transliterate.h @@ -19,6 +19,8 @@ #include #include #include +#include +#include namespace OHOS { namespace Contacts { @@ -51,8 +53,11 @@ public: std::wstring StringToWstring(std::string str); std::string WstringToString(std::wstring str); private: + icu::Transliterator* transliteratorLationToAscii; + icu::Transliterator* transliteratorHanziToPinyin; static std::map multiPronunciationMap; std::string getMultiPronunciation(std::string chineseCharacter); + void transferByTranslite(icu::Transliterator* transliterator, std::string &sourcestr, std::string &targetstr); }; } // namespace Contacts } // namespace OHOS diff --git a/ability/sinicization/src/character_transliterate.cpp b/ability/sinicization/src/character_transliterate.cpp index cc611f6..379c4e9 100644 --- a/ability/sinicization/src/character_transliterate.cpp +++ b/ability/sinicization/src/character_transliterate.cpp @@ -1970,10 +1970,17 @@ std::map CharacterTransliterate::multiPronunciationMap CharacterTransliterate::CharacterTransliterate(void) { + UErrorCode status = U_ZERO_ERROR; + transliteratorLationToAscii = icu::Transliterator::createInstance ( + icu::UnicodeString(LATIN_TO_ASCII_ICU_TRANSLITE_ID), UTransDirection::UTRANS_FORWARD, status); + transliteratorHanziToPinyin = icu::Transliterator::createInstance ( + icu::UnicodeString(HANZI_TO_PINYIN_ICU_TRANSLITE_ID), UTransDirection::UTRANS_FORWARD, status); } CharacterTransliterate::~CharacterTransliterate() { + delete transliteratorLationToAscii; + delete transliteratorHanziToPinyin; } bool CharacterTransliterate::IsChineseCharacter(wchar_t chineseCharacter) @@ -2039,14 +2046,11 @@ void CharacterTransliterate::GetCommonPronunciation( // If it is a Chinese character, there is no need to transcode Unicode here. // The system will transcode it. Only the Chinese character needs to be matched directly. if (IsChineseCharacter(chineseCharacter[0])) { - int len = 411; - for (int index = 0; index < len; index++) { - std::string::size_type find = - CharacterTransliterate::chineseTable_[index].chineseCharacters_.find(chineseCharacterString); - if (find != std::string::npos) { - initials.push_back(StringToWstring(CharacterTransliterate::chineseTable_[index].initials)); - nameFullFights.push_back(StringToWstring(CharacterTransliterate::chineseTable_[index].nameFullFight_)); - } + std::string targetstr; + transferByTranslite(transliteratorHanziToPinyin, chineseCharacterString, targetstr); + if (!targetstr.empty()) { + initials.push_back(StringToWstring(targetstr.substr(0, 1))); + nameFullFights.push_back(StringToWstring(targetstr)); } } else { initials.push_back(chineseCharacter); @@ -2054,6 +2058,15 @@ void CharacterTransliterate::GetCommonPronunciation( } } +void CharacterTransliterate::transferByTranslite(icu::Transliterator* transliterator, + std::string &sourcestr, std::string &targetstr) +{ + icu_69::UnicodeString unicodeString(sourcestr.c_str()); + + transliterator -> transliterate(unicodeString); + unicodeString.toUTF8String(targetstr); +} + // sort Chinese Pinyin combinations std::vector> CharacterTransliterate::GetCombinedVector( std::vector> sourceVector) diff --git a/bundle.json b/bundle.json index be087f3..c2babcf 100644 --- a/bundle.json +++ b/bundle.json @@ -46,7 +46,8 @@ "safwk" ], "third_party": [ - "jsoncpp" + "jsoncpp", + "icu" ] }, "build": { -- Gitee