首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在iOS中将UTF-8字符串转换为wchars?

如何在iOS中将UTF-8字符串转换为wchars?
EN

Stack Overflow用户
提问于 2012-10-09 16:16:49
回答 1查看 2.2K关注 0票数 3

我有一个Win32函数,需要移植到iOS:

代码语言:javascript
运行
复制
// Loads UTF-8 file and converts to a UTF-16 string

bool LoadUTF8File(char const *filename, wstring &str)
{
    size_t size;
    bool rc = false;
    void *bytes = LoadFile(filename, &size);
    if(bytes != 0)
    {
        int len = MultiByteToWideChar(CP_UTF8, 0, (LPCCH)bytes, size, 0, 0);
        if(len > 0)
        {
            str.resize(len + 1);
            MultiByteToWideChar(CP_UTF8, 0, (LPCCH)bytes, size, &str[0], len);
            str[len] = '\0';
            rc = true;
        }
        delete[] bytes;
    }
    return rc;
}

// LoadFile returns the loaded file as a block of memory
// There is a 3 byte BOM which MultiByteToWideChar seems to ignore
// The text in the file is encoded as UTF-8

我使用的是C++,而不是目标C,我一直试图使用mbstowcs和_mbstowcs_l,它们的行为方式似乎与MultiByteToWideChar不同。例如,“附加”一词末尾的重音字符没有被正确转换( Win32版本正确地转换它)。标准库中是否有“UTF-8到UTF-16”功能?

Win32版本中是否有一个我没有注意到的错误?

从MultiByteToWideChar返回的长度小于mbstowcs返回的长度。

奇怪的是,在这个小测试案例中

代码语言:javascript
运行
复制
    char *p = "attaché";

    wstring str;
    size_t size = strlen(p);
    setlocale(LC_ALL, "");
    int len = mbstowcs(null, p, size);
    if(len > 0)
    {
        str.resize(len + 1);
        mbstowcs(&str[0], p, size);
        str[len] = '\0';
    }
    TRACE(L"%s\n", str.c_str());

    len = MultiByteToWideChar(CP_UTF8, 0, p, size, null, 0);
    if(len > 0)
    {
        str.resize(len + 1);
        MultiByteToWideChar(CP_UTF8, 0, p, size, &str[0], len);
        str[len] = '\0';
    }
    TRACE(L"%s\n", str.c_str());

我从mbcstowcs获得正确的输出,MultiByteToWideChar错误地将最后一个字符转换为65533 (REPLACEMENT_CHARACTER)。现在我很困惑..。

EN

回答 1

Stack Overflow用户

发布于 2012-10-09 16:43:27

您是否坚持使用C++进行此操作,还是您目前所选择的方式,但在Objective中也是开放的?

在Objective中,您可以使用[yourUTF8String dataUsingEncoding:NSUTF16StringEncoding]获得包含字符串的UTF-16表示的字节的NSData。

附加假设:请注意,在您的示例中没有正确转换的"é“字符也可以通过以下事实来解释:您的解决方案可能不采用NFD形式(或者NFC形式,任何一种形式)。这意味着,如果"é“字符是在NFD中编码的,因为在”字符'e‘中有一个尖锐的重音“,它可能不能被正确地解释,而NFC形式(如”重音e字符“,即直接预编字符)则会被正确地解释。反之亦然。

这只是一个假设,实际上它取决于你的结果,而不是你所期望的"é“字,但这是值得一查的。

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

https://stackoverflow.com/questions/12804217

复制
相关文章

相似问题

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