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 -to-diacritic-ones? –
해당 질문이나 주어진 대답 모두 ICU 라이브러리를 사용하지 않습니다. –
그래서 뭐? 필수 단계는 문자열을 분해 한 다음 분음 부호를 필터링하는 것입니다. Normalizer2 클래스를 사용하십시오. –