Code pour éliminer les marques diacritiques à l’aide de l’USI

Quelqu’un peut-il fournir un exemple de code pour éliminer les signes diacritiques (remplacer les caractères accentués, les trémas, etc., par leurs équivalents non accentués, non ombrés, etc.), par exemple tout accentué deviendrait un ASCII ordinaire e ) à partir d’un UnicodeSsortingng utilisant la bibliothèque ICU en C ++? Par exemple:

 UnicodeSsortingng ssortingp_diacritics( UnicodeSsortingng const &s ) { UnicodeSsortingng result; // ... return result; } 

Supposons que s ait déjà été normalisé. Merci.

ICU vous permet de translittérer une chaîne en utilisant une règle spécifique. Ma règle est la NFD; [:M:] Remove; NFC NFD; [:M:] Remove; NFC NFD; [:M:] Remove; NFC : décompose, élimine les diacritiques, recompose. Le code suivant prend un std::ssortingng UTF-8 en entrée et renvoie un autre std::ssortingng UTF-8:

 #include  #include  #include  std::ssortingng desaxUTF8(const std::ssortingng& str) { // UTF-8 std::ssortingng -> UTF-16 UnicodeSsortingng UnicodeSsortingng source = UnicodeSsortingng::fromUTF8(SsortingngPiece(str)); // Transliterate UTF-16 UnicodeSsortingng 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 UnicodeSsortingng -> UTF-8 std::ssortingng std::ssortingng result; source.toUTF8Ssortingng(result); return result; } 

Après avoir cherché ailleurs:

 UErrorCode status = U_ZERO_ERROR; UnicodeSsortingng result; // 's16' is the UTF-16 ssortingng 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::ssortingng 's8' elided ssortingng buf8; buf8.reserve( s8.length() ); for ( ssortingng::const_iterator i = s8.begin(); i != s8.end(); ++i ) { char const c = *i; if ( isascii( c ) ) buf8.push_back( c ); } // result is in buf8 

qui est O (n).