Это дополнительный вопрос к предыдущему.
Проблема в этом вопросе была решена, и теперь код работает, как и ожидалось, однако окончательный результат преобразования utf-8 в ucs2 — тарабарщина. Под этим я подразумеваю, что шестнадцатеричные значения окончательного текста никоим образом не соответствуют версии utf-8. Я знаю, что это разные кодировки, но, похоже, между ними нет никакого сопоставления.
Вход в преобразование — «ĩ», выход — «ÿþ)^A». В шестнадцатеричном формате это c4a9 для "ĩ" (значение utf-8) и "00FF 00FE 0029 0001" для "ÿþ)^A" (значения ucs2).
Я надеюсь, что у кого-то есть объяснение этому поведению или он может сказать мне, что я сделал неправильно в коде.
Новый обновленный код:
UErrorCode resultCode = U_ZERO_ERROR;
UConverter* pLatinOneConv = ucnv_open("ISO-8859-1", &resultCode);
// Change the callback to error out instead of the default
const void* oldContext;
UConverterFromUCallback oldFromAction;
UConverterToUCallback oldToAction;
ucnv_setFromUCallBack(pLatinOneConv, UCNV_FROU_CALLBACK_STOP, NULL, &oldFromAction, &oldContext, &resultCode);
ucnv_setToUCallBack(pLatinOneConv, UCNV_TO_U_CALLBACK_STOP, NULL, &oldToAction, &oldContext, &resultCode);
int32_t outputLength = 0;
int bodySize = uniString.length();
int targetSize = bodySize * 4;
char* target = new char[targetSize];
printf("Body: %s\n", uniString.c_str());
if (U_SUCCESS(resultCode))
{
outputLength = ucnv_fromAlgorithmic(pLatinOneConv, UCNV_UTF8, target, targetSize, uniString.c_str(),
uniString.length(), &resultCode);
ucnv_close(pLatinOneConv);
}
printf("ISO-8859-1 just tried to convert '%s' to '%s' with error '%i' and length '%i'", uniString.c_str(),
outputLength ? target : "invalid_char", resultCode, outputLength);
if (resultCode == U_INVALID_CHAR_FOUND || resultCode == U_ILLEGAL_CHAR_FOUND || resultCode == U_TRUNCATED_CHAR_FOUND)
{
if (resultCode == U_INVALID_CHAR_FOUND)
{
resultCode = U_ZERO_ERROR;
printf("Unmapped input character, cannot be converted to Latin1");
// segment Text, if necessary, and add UUIDs copy existing pPdu's addresses and optionals
UConverter* pUscTwoConv = ucnv_open("UCS-2", &resultCode);
if (U_SUCCESS(resultCode))
{
printf("Text Body: %s\n", uniString.c_str());
outputLength = ucnv_fromAlgorithmic(pUscTwoConv, UCNV_UTF8, target, targetSize, uniString.c_str(),
uniString.length(), &resultCode);
ucnv_close(pUscTwoConv);
}
printf("UCS-2 just tried to convert '%s' to '%s' with error '%i' and length '%i'", uniString.c_str(),
outputLength ? target : "invalid_char", resultCode, outputLength);
if (U_SUCCESS(resultCode))
{
pdus = SegmentText(target, pPdu, SEGMENT_SIZE_UNICODE_MAX, true);
}
}
else
{
printf("DecodeText(): Text contents does not appear to be valid UTF-8");
}
}
else
{
printf("DecodeText(): Text successfully converted to Latin1");
std::string newBody(target, outputLength);
pdus = SegmentText(newBody, pPdu, SEGMENT_SIZE_MAX);
}
printf
преобразовать строку в кодировке UTF-8 и строку в кодировке UTF-16 в один и тот же файл. Это не будет работать для многих допустимых строк. Как вы смотрите на свои шестнадцатеричные значения? Вы когда-нибудь нуждались в отделении интенсивной терапии? Это очень большая и сложная библиотека. Для простых задач больше подходитlibiconv
. - person n. 1.8e9-where's-my-share m.   schedule 06.03.2014