gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:44:18 26 4
gpt4 key购买 nike

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

// 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++,而不是 Objective C,并且我一直在尝试使用 mbstowcs 和 _mbstowcs_l。它们的行为方式似乎与 MultiByteToWideChar 不同。例如,attaché 一词末尾的重音字符未正确转换(Win32 版本正确转换)。标准库中某处是否有“UTF-8 到 UTF-16”函数?

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

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

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

    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)。现在我很困惑......

最佳答案

您是坚持为此使用 C++,还是只是您目前选择的方式,但也愿意在 Objective-C 中使用它?

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


其他假设:请注意,您的示例中未正确转换的“é”字符也可能是因为您的解决方案可能未采用 NFD 形式(或 NFC 形式,两者皆有)。这意味着如果“é”字符在 NFD 中被编码为“带重音符的字符‘e’”,则它可能无法正确解释,而 NFC 形式(如“重音符 e”,即前-直接组成字符)它会。反之亦然。

这只是一个假设,实际上它取决于您得到的结果而不是您期望的“é”字符,但值得验证。

关于c++ - 如何在 iOS 中将 UTF-8 字符串转换为 wchars?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12804217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com