You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
/***********************************************************************
|
|
* © 2016 and later: Unicode, Inc. and others.
|
|
* License & terms of use: http://www.unicode.org/copyright.html
|
|
***********************************************************************
|
|
* COPYRIGHT:
|
|
* Copyright (c) 1999-2002, International Business Machines Corporation and
|
|
* others. All Rights Reserved.
|
|
***********************************************************************/
|
|
|
|
#include "unaccent.h"
|
|
|
|
/**
|
|
* Constructor
|
|
*/
|
|
UnaccentTransliterator::UnaccentTransliterator() :
|
|
normalizer("", Normalizer::DECOMP),
|
|
Transliterator("Unaccent", 0) {
|
|
}
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
UnaccentTransliterator::~UnaccentTransliterator() {
|
|
}
|
|
|
|
/**
|
|
* Remove accents from a character using Normalizer.
|
|
*/
|
|
UChar UnaccentTransliterator::unaccent(UChar c) const {
|
|
UnicodeString str(c);
|
|
UErrorCode status = U_ZERO_ERROR;
|
|
UnaccentTransliterator* t = (UnaccentTransliterator*)this;
|
|
|
|
t->normalizer.setText(str, status);
|
|
if (U_FAILURE(status)) {
|
|
return c;
|
|
}
|
|
return (UChar) t->normalizer.next();
|
|
}
|
|
|
|
/**
|
|
* Implement Transliterator API
|
|
*/
|
|
void UnaccentTransliterator::handleTransliterate(Replaceable& text,
|
|
UTransPosition& index,
|
|
UBool incremental) const {
|
|
UnicodeString str("a");
|
|
while (index.start < index.limit) {
|
|
UChar c = text.charAt(index.start);
|
|
UChar d = unaccent(c);
|
|
if (c != d) {
|
|
str.setCharAt(0, d);
|
|
text.handleReplaceBetween(index.start, index.start+1, str);
|
|
}
|
|
index.start++;
|
|
}
|
|
}
|