Исходный код для Apache Xerces: ConvertUTF16toUCS4 является:
ConversionResult ConvertUTF16toUCS4(
UTF16 **sourceStart, UTF16 *sourceEnd,
UCS4 **targetStart, const UCS4 *targetEnd)
{
ConversionResult result = ok;
register UTF16 *source = *sourceStart;
register UCS4 *target = *targetStart;
while (source < sourceEnd)
{
register UCS4 ch;
ch = *source++;
if (ch >= kSurrogateHighStart && ch <= kSurrogateHighEnd && source < sourceEnd)
{
register UCS4 ch2 = *source;
if (ch2 >= kSurrogateLowStart && ch2 <= kSurrogateLowEnd)
{
ch = ((ch - kSurrogateHighStart) << halfShift) + (ch2 - kSurrogateLowStart) + halfBase;
++source;
};
};
if (target >= targetEnd)
{
result = targetExhausted;
break;
};
*target++ = ch;
};
*sourceStart = source;
*targetStart = target;
return result;
};
Я пытаюсь преобразовать суррогатные пары в кодировке UTF16 в данные в кодировке UCS4.
Я использую WindowsOS и немного порядковый номер.
Если вы посмотрите внимательно, вы можете увидеть, что после преобразования они присваивают
цель для *targetStart
, Так не будет ли он указывать на последний элемент цели вместо первого элемента цели?
Когда я удаляю заявление *targetStart = target;
из моего кода, он работает, как ожидалось. Это ошибка в API или я что-то упустил?
Задача ещё не решена.