如何在NSString指定索引处正确提取€字符避免乱码?
解决iOS中提取Unicode字符时的乱码问题
问题根源
NSString采用UTF-16编码存储字符,characterAtIndex:返回的是16位的unichar类型值。€的Unicode编码是U+20AC,对应UTF-16的0x20AC,而你用stringWithFormat:@"%c"提取时,%c会把16位值截断为低8位(0xAC),对应ASCII字符¬,导致乱码。£的Unicode是U+00A3,UTF-16值为0x00A3,低8位0xA3恰好对应部分编码中的£,所以没有出现问题,但这是偶然情况,提取逻辑本身存在错误。
修复方案
正确提取单个字符
放弃%c的提取方式,改用substringWithRange直接截取完整的Unicode字符,该方法会自动处理所有UTF-16编码的字符:NSRange charRange = NSMakeRange(i, 1); NSString* character = [text substringWithRange:charRange];确保字符池编码正确
保持字符池字符串中的€符号不变,Xcode默认使用UTF-8编码保存文件,会自动转换为NSString内部的UTF-16编码,无需手动替换转义序列。正常执行键盘点击逻辑
提取到正确的@"€"字符串后,直接用它匹配键盘键的label即可:[self.app.keys[character] tap];
内容的提问来源于stack exchange,提问作者InfiniteLoop
相关产品推荐
相关产品推荐

