如何显示或转换(非标准)\ U0099 for Trademark" TM"字符?

时间:2015-02-11 03:46:25

标签: ios objective-c unicode nsstring

我遇到了一些显示商标" TM"我的UILabel上的角色。

" TM"出现问题的角色是\ U0099而不是通常的\ U2122
我深入挖掘并发现了" TM" character \ U0099属于极少数中文字体。

所以我猜测iOS没有字体在标签中显示或根本不识别它。

我试图扫描我的数据" \ U0099"和string替换它到\ U2122,但似乎NSString函数将自动转义unicode字符,所以这" TM"人物甚至不会在那里。

以前有没有人遇到过这个问题,或者可以就如何处理这个\ U0099字符给我一些建议?

提前致谢

2 个答案:

答案 0 :(得分:1)

我不清楚您是如何获得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:&notTMChar length:2 encoding:NSUTF16LittleEndianStringEncoding];

并且可以在字符串替换调用中使用:

NSString *t = [s stringByReplacingOccurrencesOfString:notTMStr withString:@"™"];

给予t值" abc™def"根据需要。

警告:我们正在处理未分配的Unicode控制字符。 Clang / Cocoa以UTF-8拒绝了它,它可能是无意的,它接受了UTF-16。使用C库函数执行此操作可能更可靠。使用带有Clang 5.1的Xcode 5.1.1进行测试。

HTH

答案 1 :(得分:0)

感谢您的建议 我和我的客户谈过,他们同意不应该在那里 我还实现了rmaddy的建议,将实例\ 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
    }