首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表情字符串转换为icu::UnicodeString

将表情字符串转换为icu::UnicodeString
EN

Stack Overflow用户
提问于 2020-02-12 11:21:39
回答 1查看 239关注 0票数 0

我有一个方法读取json文件并返回一个const char*,它可以是任何文本,包括表情符号。我无法访问此方法的源代码。

例如,我创建了一个带有英格兰国旗{message: "\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67\uDB40\uDC7F"}(???????)的json文件。

当我调用该方法时,它返回类似于🏴󠁧󠁢󠁥󠁮󠁧󠁿的内容,但是为了正确使用它,我需要将它转换为icu::UnicodeString,因为我使用了另一个需要它的方法(同样是封闭源码)。

我发现让它工作的唯一方法是这样的:

代码语言:javascript
复制
icu::UnicodeString unicode;
unicode.setTo((UChar*)convertMessage().data());
std::string messageAsString;
unicode.toUTF8String(messageAsString);

这样做之后,messageAsString就可以使用了,一切都可以正常工作。

convertMessage()是一种使用std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t>::from_bytes(str)的方法。

我的问题是,有没有一种方法可以在不使用额外convertMessage()调用的情况下创建icu::UnicodeString

EN

回答 1

Stack Overflow用户

发布于 2020-02-12 15:44:55

这是ucnv_toUChars函数的用法示例。我从postgresql源代码中获取了这些函数,并将其用于我的项目。

代码语言:javascript
复制
UConverter *icu_converter;

  static int32_t icu_to_uchar(UChar **buff_uchar, const char *buff, int32_t nbytes)
{
    UErrorCode  status;
    int32_t     len_uchar;

    status = U_ZERO_ERROR;
    len_uchar = ucnv_toUChars(icu_converter, NULL, 0,buff, nbytes, &status);
    if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
        return -1;

    *buff_uchar = (UChar *) malloc((len_uchar + 1) * sizeof(**buff_uchar));

    status = U_ZERO_ERROR;
    len_uchar = ucnv_toUChars(icu_converter, *buff_uchar, len_uchar + 1,buff, nbytes, &status);
    if (U_FAILURE(status))
        assert(0); //(errmsg("ucnv_toUChars failed: %s", u_errorName(status))));

    return len_uchar;
}
static int32_t icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar)
{
    UErrorCode  status;
    int32_t     len_result;

    status = U_ZERO_ERROR;
    len_result = ucnv_fromUChars(icu_converter, NULL, 0,
        buff_uchar, len_uchar, &status);
    if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
        assert(0); // (errmsg("ucnv_fromUChars failed: %s", u_errorName(status))));

    *result = (char *) malloc(len_result + 1);

    status = U_ZERO_ERROR;
    len_result = ucnv_fromUChars(icu_converter, *result, len_result + 1,
        buff_uchar, len_uchar, &status);
    if (U_FAILURE(status))
        assert(0); // (errmsg("ucnv_fromUChars failed: %s", u_errorName(status))));

    return len_result;
}

void main() {

    const char *utf8String = "Hello";
    int len = 5;
    UErrorCode  status = U_ZERO_ERROR;

    icu_converter = ucnv_open("utf8", &status);
    assert(status <= U_ZERO_ERROR);

    UChar      *buff_uchar;
    int32_t len_uchar = icu_to_uchar(&buff_uchar, ut8String, len);

    // use buff_uchar

    free(buff_uchar);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60180598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档