gpt4 book ai didi

c++ - 当从 NSMutableString 中删除 UTF8 表情符号字符时,到 std::string 的转换失败

转载 作者:行者123 更新时间:2023-11-28 05:57:25 26 4
gpt4 key购买 nike

我有一个包含 NSMutableString 的 objective-c 类。该字符串表示 iOS 游戏中的玩家名称。我的实现中还有一个 std::string 属性,它包含与 NSMutableString 相同的数据:

{
@private
std::string m_textCppString;
}

当我向 NSMutableString 添加字符时,我也将其内容复制到 std::string:

-(void)insertChar:(NSString *)c {
[m_objcMutableStr appendString:c];
m_textCppString = [m_objcMutableStr UTF8String];
}

当我从 NSMutableString 中删除字符时,我还将 NSMutableString 的内容复制到 std::string:

- (void)deleteChar {
if ([m_objcMutableStr length] > 0) {
[m_objcMutableStr deleteCharactersInRange:NSMakeRange([m_objcMutableStr length]-1, 1)];
}
m_textCppString = [m_objcMutableStr UTF8String];
}

当我使用属于 ASCII 范围的普通拉丁字母字符时,这些方法效果很好。

插入也适用于 UTF8 字符。 Xcode 调试器显示笑脸或我在 m_textCppString 中测试的任何表情符号,没有任何问题。

然而,当我删除表情符号字符时,NSMutableStr 被正确修改,但转换为 std::string 失败。调试器在带有 EXC_BAD_ACCESS 的 string 类行 1370 处停止:

_LIBCPP_INLINE_VISIBILITY basic_string& operator=(const value_type* __s) {return assign(__s);}

如果我尝试将 NSMutableString 转换为 const char*,它不会崩溃,而是返回 NULL。

似乎 deleteCharactersInRange 方法以某种方式破坏了 NSMutableString,使其无法再转换为 std::string。奇怪的是,只有在使用表情符号(即特定于 UTF8 的字符)时才会发生这种情况。

最佳答案

NSString 假定字符串由 16 位单元组成。对于不正确的 Emoji 字符,它们由两个 16 位单元组成。如果字符串的最后一个字符是 Emoji 字符,并且将长度减一,则字符串以半个 Emoji 字符结尾,这不是有效的 Unicode。从那时起,事情就会出错。

所有前 65536 个 Unicode 代码点都可以。 U10000 以上的所有代码点(不仅仅是 Emoji)都会有问题。所以你的假设很接近并确定了问题。它只是比你想象的要少,既好又坏:-)

关于c++ - 当从 NSMutableString 中删除 UTF8 表情符号字符时,到 std::string 的转换失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33876621/

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