• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**********************************************************************
2  * © 2016 and later: Unicode, Inc. and others.
3  * License & terms of use: http://www.unicode.org/copyright.html
4  **********************************************************************
5  **********************************************************************
6  * COPYRIGHT:
7  * Copyright (c) 1999-2003, International Business Machines Corporation and
8  * others. All Rights Reserved.
9  **********************************************************************/
10 
11 #include "unaccent.h"
12 
13 const char UnaccentTransliterator::fgClassID = 0;
14 
15 /**
16  * Constructor
17  */
UnaccentTransliterator()18 UnaccentTransliterator::UnaccentTransliterator() :
19     normalizer("", UNORM_NFD),
20     Transliterator("Unaccent", 0) {
21 }
22 
23 /**
24  * Destructor
25  */
~UnaccentTransliterator()26 UnaccentTransliterator::~UnaccentTransliterator() {
27 }
28 
29 /**
30  * Remove accents from a character using Normalizer.
31  */
unaccent(UChar c) const32 UChar UnaccentTransliterator::unaccent(UChar c) const {
33     UnicodeString str(c);
34     UErrorCode status = U_ZERO_ERROR;
35     UnaccentTransliterator* t = (UnaccentTransliterator*)this;
36 
37     t->normalizer.setText(str, status);
38     if (U_FAILURE(status)) {
39         return c;
40     }
41     return (UChar) t->normalizer.next();
42 }
43 
44 /**
45  * Implement Transliterator API
46  */
handleTransliterate(Replaceable & text,UTransPosition & index,UBool incremental) const47 void UnaccentTransliterator::handleTransliterate(Replaceable& text,
48                                                  UTransPosition& index,
49                                                  UBool incremental) const {
50     UnicodeString str("a");
51     while (index.start < index.limit) {
52         UChar c = text.charAt(index.start);
53         UChar d = unaccent(c);
54         if (c != d) {
55             str.setCharAt(0, d);
56             text.handleReplaceBetween(index.start, index.start+1, str);
57         }
58         index.start++;
59     }
60 }
61