分解连字(最好使用 ICU)
Decompose ligatures (preferably with ICU)
我正在寻找一种干净的方法来分解 Unicode 字符串中的连字(例如 – -> oe)。有没有办法不把所有的规则都一一列举出来呢?类似于 this rule for removing diacritical marks 但用于连字。
正在阅读the ICU documentation on transforms,看来你需要这个
Latin-ASCII
所以我想通过做与您的链接问题类似的事情应该有效(代码未经测试):
#include <unicode/utypes.h>
#include <unicode/unistr.h>
#include <unicode/translit.h>
std::string asciiifyUTF8(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 *asciiConverter = Transliterator::createInstance(
"Latin-ASCII", UTRANS_FORWARD, status);
asciiConverter->transliterate(source);
// TODO: handle errors with status
// UTF-16 UnicodeString -> UTF-8 std::string
std::string result;
source.toUTF8String(result);
return result;
}
请注意,这也会去除重音符号等,因为输出将仅限于 ASCII 字符。
您可以过滤转换适用的输入,但(法语)连字字符不在任何特殊区域(法语实际上只有两个)?
浏览 Unicode 字符,其他各种脚本中的连字似乎更多,因此上述建议可能不是您要找的。
我正在寻找一种干净的方法来分解 Unicode 字符串中的连字(例如 – -> oe)。有没有办法不把所有的规则都一一列举出来呢?类似于 this rule for removing diacritical marks 但用于连字。
正在阅读the ICU documentation on transforms,看来你需要这个
Latin-ASCII
所以我想通过做与您的链接问题类似的事情应该有效(代码未经测试):
#include <unicode/utypes.h>
#include <unicode/unistr.h>
#include <unicode/translit.h>
std::string asciiifyUTF8(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 *asciiConverter = Transliterator::createInstance(
"Latin-ASCII", UTRANS_FORWARD, status);
asciiConverter->transliterate(source);
// TODO: handle errors with status
// UTF-16 UnicodeString -> UTF-8 std::string
std::string result;
source.toUTF8String(result);
return result;
}
请注意,这也会去除重音符号等,因为输出将仅限于 ASCII 字符。 您可以过滤转换适用的输入,但(法语)连字字符不在任何特殊区域(法语实际上只有两个)? 浏览 Unicode 字符,其他各种脚本中的连字似乎更多,因此上述建议可能不是您要找的。