分解连字(最好使用 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 字符,其他各种脚本中的连字似乎更多,因此上述建议可能不是您要找的。