我在UILabel上显示商标"TM“字符时遇到了一些问题。
出现问题的"TM“字符是\U0099,而不是通常的\U2122
我再深入一点,发现"TM“字符\U0099属于很少的中文字体。
所以我猜iOS没有在标签中显示它的字体,或者根本不能识别它。
我尝试在我的数据中扫描"\U0099“并将其字符串替换为\U2122,但似乎NSString函数将自动转义unicode字符,因此这个"TM”字符甚至不在那里。
是否有人以前遇到过此问题,或者可以就如何处理此\U0099字符给我建议?
提前感谢
发布于 2015-02-12 02:29:10
我不清楚你是如何获得NSString的,也不清楚你实际上试图解决什么问题。所以这个建议可能完全不合适,但让我们看看它是否有帮助…
U+0099是未分配的Unicode控制字符,它不是TM符号。如果您将转义放入文字中,则将此字符作为Clang至少对象放入NSString中是相当困难的,并且Cocoa无法将UTF-8中的字节序列转换为NSString。这个问题可能是你的评论背后的问题,你不能用字符串替换它。
然而,从UTF-16开始,我确实成功地创建了一个包含U+0099的字符串:
unichar b[] = { 0x61, 0x62, 0x63, 0x99, 0x64, 0x65, 0x66 };
NSString *s = [[NSString alloc] initWithBytes:b length:14 encoding:NSUTF16LittleEndianStringEncoding];这就是字符串"abc\U0099def“(调用characterAtIndex:3将显示以下内容)。
使用同样的方法,可以生成一个只包含U+0099的NSString:
unichar notTMChar = 0x99;
NSString *notTMStr = [[NSString alloc] initWithBytes:¬TMChar length:2 encoding:NSUTF16LittleEndianStringEncoding];并且可以在字符串替换调用中使用:
NSString *t = [s stringByReplacingOccurrencesOfString:notTMStr withString:@"™"];根据需要给t赋值"abc™def“。
警告:我们正在处理一个未分配的Unicode控制字符。Clang/Cocoa在UTF-8中拒绝了它,它在UTF-16中接受它可能是无意的。使用C库函数来做这件事可能更可靠。Xcode5.1.1和Clang5.1用于测试。
HTH
发布于 2015-02-12 11:57:48
谢谢你的建议。
我已经和我的客户谈过了,他们同意\u0099不应该在那里。
我还实现了rmaddy的建议,将instance \u0099替换为\u2122。
NSString *problemString = dictionaryWithU099AsValue.description;
if ([problemString rangeOfString:@"0099"].location != NSNotFound) {
NSString *fixedDescriptionString = [[[problemString stringByReplacingOccurrencesOfString:@"U0099" withString:@"U2122"];
// Then I reconstruct the NSString back to a new NSDictionary
}发布于 2022-01-21 22:16:59
请注意,商标符号在Code Page 1252 (一种常见的™字符集)中显示为十六进制99。
https://stackoverflow.com/questions/28446264
复制相似问题