ICU可以直接在大端机器上对UTF-16LE数据进行排序比较吗?

Can ICU perform collation comparisons on UTF-16LE data on big endian machines directly?

本文关键字:数据 UTF-16LE 排序 比较 机器 ICU      更新时间:2023-10-16

我有以下代码:

UCharIterator iter1;
UCharIterator iter2;
UErrorCode status = U_ZERO_ERROR;
if (ENC_UTF16_BE == m_encoding)
{
    uiter_setUTF16BE(&iter1, reinterpret_cast<const char*>(in_string1), in_length1);
    uiter_setUTF16BE(&iter2, reinterpret_cast<const char*>(in_string2), in_length2);
    return ucol_strcollIter(m_collator, &iter1, &iter2, &status);
}
else if (ENC_UTF8 == m_encoding)
{
    uiter_setUTF8(&iter1, reinterpret_cast<const char*>(in_string1), in_length1);
    uiter_setUTF8(&iter2, reinterpret_cast<const char*>(in_string2), in_length2);
    return ucol_strcollIter(m_collator, &iter1, &iter2, &status);
}
else
{
    UnicodeString s1(reinterpret_cast<const char*>(in_string1), in_length1);
    UnicodeString s2(reinterpret_cast<const char*>(in_string2), in_length2);
    return ucol_strcoll(m_collator, s1.getBuffer(), s1.length(), s2.getBuffer(), s2.length());
}

现在,它遵循数据编码匹配ICU内部编码的"快乐路径",在小端系统上,它是UTF16-LE。

但是,如果这是在大端系统上编译的,并且编码是UTF16-LE,我们将被迫转到'一般'情况,这涉及到创建一个UnicodeString对象,以及隐含的转换。

似乎应该有一个uiter_setUTF16LE函数在这种情况下,但没有?这是过去ICU内部一直使用UTF16-LE的产物吗?是否有另一种方式做到这一点,或者我被迫复制/转换?

看起来我可以实现我自己的UCharIterator的'子类'来做到这一点。似乎很不幸,我需要为一些看起来相对常见的情况做这个。