diff --git a/BUILD.gn b/BUILD.gn index 18fc6097398f1de787ffc6398fefa2a97965634e..3e594b5b6f8f2ae09a640a1721f56a49489122af 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -118,10 +118,17 @@ ohos_shared_library("contactsdataability") { "//base/account/os_account/interfaces/kits/napi/distributedaccount/include/", "//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 eea98ad47e060c7ce33ec7218b648e9186f9ebae..10a48b141ef65e2de22c853326b3e340c18e5dde 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 7cd8965939f001c0b7738377d2a988b84f2b5564..b461cdf22467fa6f4edc5105bb7e3193660d59c1 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 cc611f6319cfd0e90616a85788b5eba883c1f662..dbe0a387c5f9b1fef0b642f2316e01aaa627a0fe 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,13 @@ 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 +2060,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 be087f3f43463d684eb1182516bf91cd7ccb01c8..c2babcfcba10b2a7cc7fcd3b59ceef8403b3f506 100644 --- a/bundle.json +++ b/bundle.json @@ -46,7 +46,8 @@ "safwk" ], "third_party": [ - "jsoncpp" + "jsoncpp", + "icu" ] }, "build": {