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