2010-06-07 53 views
4

有人可以提供一些示例代碼來剝離變音標記(即,將帶有重音符號,變音符號等的字符替換爲它們的不重疊,不變等等,字符等效,例如每個重音符號é將成爲一個簡單的ASCII e)從UnicodeString使用ICU庫在C + +?例如:使用ICU剝離變音標記的代碼

UnicodeString strip_diacritics(UnicodeString const &s) { 
    UnicodeString result; 
    // ... 
    return result; 
} 

假定s已經歸一化。謝謝。

+1

重複的:http://stackoverflow.com/questions/331279/how-to-change-diacritic-characters非音名詞? – 2010-06-07 18:28:54

+0

這個問題和任何給定的答案都不使用ICU庫。 – 2010-06-07 18:51:56

+1

那又如何?關鍵的一步是分解字符串,然後過濾掉變音符號。使用Normalizer2類。 – 2010-06-07 19:36:17

回答

-1

經過搜索別處:

UErrorCode status = U_ZERO_ERROR; 
UnicodeString result; 

// 's16' is the UTF-16 string to have diacritics removed 
Normalizer::normalize(s16, UNORM_NFKD, 0, result, status); 
if (U_FAILURE(status)) 
    // complain 

// code to convert UTF-16 's16' to UTF-8 std::string 's8' elided 

string buf8; 
buf8.reserve(s8.length()); 
for (string::const_iterator i = s8.begin(); i != s8.end(); ++i) { 
    char const c = *i; 
    if (isascii(c)) 
    buf8.push_back(c); 
} 
// result is in buf8 

其爲O(n)。

+3

你不想刪除任何非ASCII,只是變音符號。此代碼僅適用於幾種語言。 – 2012-10-25 14:46:31

14

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; 
} 
+0

非常有用。我更喜歡[:Mn:]而不是[:M:],因爲後者刪除了印地文文本中的元音標記,我認爲這些元音標記是有意義的。 – 2013-10-20 16:18:43

+0

@JyotirmoyBhattacharya Unicode製作的區別是基於佈局而不是語義:這適合您對印地語的需求,但總體上不是一個好主意。 (和變音符在很多語言中都有含義。)感謝您的評論! – 2013-10-21 11:12:46