ICU允許您使用特定規則音譯字符串。我的規則是NFD; [:M:] Remove; NFC
:分解,刪除變音符號,重新構造。下面的代碼需要一個UTF-8 std::string
作爲輸入,並返回另一個UTF-8 std::string
:
#include <unicode/utypes.h>
#include <unicode/unistr.h>
#include <unicode/translit.h>
std::string desaxUTF8(const std::string& str) {
// UTF-8 std::string -> UTF-16 UnicodeString
UnicodeString source = UnicodeString::fromUTF8(StringPiece(str));
// Transliterate UTF-16 UnicodeString
UErrorCode status = U_ZERO_ERROR;
Transliterator *accentsConverter = Transliterator::createInstance(
"NFD; [:M:] Remove; NFC", UTRANS_FORWARD, status);
accentsConverter->transliterate(source);
// TODO: handle errors with status
// UTF-16 UnicodeString -> UTF-8 std::string
std::string result;
source.toUTF8String(result);
return result;
}
重複的:http://stackoverflow.com/questions/331279/how-to-change-diacritic-characters非音名詞? – 2010-06-07 18:28:54
這個問題和任何給定的答案都不使用ICU庫。 – 2010-06-07 18:51:56
那又如何?關鍵的一步是分解字符串,然後過濾掉變音符號。使用Normalizer2類。 – 2010-06-07 19:36:17