如何在Objective-C中通过Unicode显示波斯语脚本?求解决方案
解决Objective-C中波斯语Unicode转义字符串解码问题
你的代码没得到预期结果,核心原因是你当前处理的字符串里,u0622这类内容是作为普通文本存在的(没有带反斜杠的转义前缀),而NSNonLossyASCIIStringEncoding只能处理包含完整转义符(比如\u0622)的字符串,所以没法正确解析。
给你一个实用的Objective-C解决方案,我们可以写一个字符串分类来手动解析这种uXXXX格式的Unicode转义序列:
第一步:添加NSString分类
@interface NSString (UnicodeDecode) - (NSString *)decodeUnicodeEscapes; @end @implementation NSString (UnicodeDecode) - (NSString *)decodeUnicodeEscapes { NSMutableString *resultString = [NSMutableString stringWithCapacity:self.length]; NSScanner *scanner = [NSScanner scannerWithString:self]; NSString *tempSegment; while (![scanner isAtEnd]) { // 扫描到下一个"u"之前的普通文本 [scanner scanUpToString:@"u" intoString:&tempSegment]; if (tempSegment) { [resultString appendString:tempSegment]; } // 已经到字符串末尾就退出循环 if ([scanner isAtEnd]) break; // 跳过当前的"u"字符 [scanner scanString:@"u" intoString:NULL]; // 扫描后续的4位十六进制数字,转换成对应Unicode字符 unsigned int unicodeCode; if ([scanner scanHexInt:&unicodeCode]) { [resultString appendFormat:@"%C", (unichar)unicodeCode]; } else { // 如果不是有效的十六进制,把"u"重新加回去 [resultString appendString:@"u"]; } } return resultString; } @end
第二步:调用解码方法
把你得到的那个结果字符串传入这个方法,就能得到正确的波斯语文本:
NSString *encodedText = @"u0622u062fu0631u0633 u0627u06ccu0645u06ccu0644"; NSString *decodedPersianText = [encodedText decodeUnicodeEscapes]; NSLog(@"解码结果:%@", decodedPersianText); // 输出:ادرم ایمیل
另外补充一点:如果你的原始字符串是带有反斜杠的完整转义(比如@"\u0622\u062f\u0631\u0633 \u0627\u06cc\u0645\u06cc\u0644"),那其实直接输出这个字符串就能得到正确结果——因为编译器会自动解析这些Unicode转义序列,不需要额外处理。
内容的提问来源于stack exchange,提问作者Ghazalah
相关产品推荐
相关产品推荐

