2015-02-11 58 views
1

我遇到了一些在我的UILabel上显示商标“TM”字符的问题。

问题出现的“TM”字符是\ U0099而不是通常的\ U2122
我深入挖掘并找出“TM”字符\ U0099属于极少数中文字体。如何为商标“TM”字符显示或转换(非标准) U0099?

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

我试图扫描我的数据“\ U0099”和stringreplace它\ U2122,但好像NSString的功能将自动跳脱Unicode字符所以这次“以旧换新”字甚至不会在那里。

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

预先感谢

+1

'\ U0099'不是一个有效的Unicode字符。'\ U0099'从哪里来?为什么不使用正确的字符? – rmaddy 2015-02-11 04:02:58

+0

来自客户端的数据库。客户端位于亚洲,所以我假设他们有很多中文数据。 [link](http://www.fileformat.info/info/unicode/char/0099/index.htm)我知道一个事实,你可以在其他语言的输入法中使用不同的字符。例如“,”和“,” – timlwting 2015-02-11 04:53:53

+1

Unicode是Unicode而不管语言或语言环境如何。 '\ U2122'是TM符号唯一的Unicode字符。这可能是因为你的客户端正在使用一些非Unicode(或非UTF)字符编码,导致TM符号被编码为十六进制值为'99',但它不会是'\ U0099'。如果你知道数据是什么编码,你可以简单地使用适当的编码从NSData中创建一个'NSString'。 – rmaddy 2015-02-11 05:00:58

回答

1

你是如何得到这我不清楚你NSString或者你有什么真实目的是试图解决您的问题。所以这个建议可能完全不合适,但让我们看看它是否有帮助...

U + 0099是一个未分配的Unicode控制字符,它不是TM符号。如果将转义符放入文字中,至少要将对象转换为,那么很难将这个字符转换成一个,否则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会告诉你这个)。

使用相同的方法的NSString只有U + 0099在它可以产生:

和可在一个字符串中使用替换呼叫:

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

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

警告:我们正在处理未分配的Unicode控制字符。 Clang/Cocoa以UTF-8拒绝它,它可能是无意的,它以UTF-16接受它。使用C库函数来做到这一点可能更可靠。 Xcode 5.1.1和Clang 5.1被用于测试。

HTH

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 
    }