diff --git a/BUILD.gn b/BUILD.gn index 18fc6097398f1de787ffc6398fefa2a97965634e..efbcbba47b5b1c7c385585d56f40b9b64d5c14f2 100644 --- a/BUILD.gn +++ b/BUILD.gn @@ -10,6 +10,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +# test import("//build/lite/config/component/lite_component.gni") import("//build/ohos.gni") @@ -119,9 +120,14 @@ 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/jsoncpp:jsoncpp", "//third_party/icu/icu4c:shared_icui18n", + "//third_party/icu/icu4c:shared_icuuc" ] public_configs = [ ":contactsdataability_public_config" ] external_deps = [ diff --git a/ability/common/include/common.h b/ability/common/include/common.h index eea98ad47e060c7ce33ec7218b648e9186f9ebae..080ad47f1f70f97820bd0ec5933071d9d98869d7 100644 --- a/ability/common/include/common.h +++ b/ability/common/include/common.h @@ -123,6 +123,16 @@ 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 = "..."; +// 无名氏排序数字,无名氏信息需要排到字母的后边 +// 如果是字母最大是z,对应90,升序排列,无名氏需要在90后边 +// 排序字段存99 +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..57534b4228f484de736d421b43f256c2817b9f9d 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) @@ -2038,20 +2045,28 @@ void CharacterTransliterate::GetCommonPronunciation( std::string chineseCharacterString = WstringToString(chineseCharacter); // 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_)); - } - } - } else { - initials.push_back(chineseCharacter); - nameFullFights.push_back(chineseCharacter); - } + if (IsChineseCharacter(chineseCharacter[0])) { + 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); + nameFullFights.push_back(chineseCharacter); + } +} + +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 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": {