【问题标题】:How to show or convert (non-standard) \U0099 for Trademark "TM" Character?如何为商标“TM”字符显示或转换(非标准)\U0099?
【发布时间】:2015-02-11 03:46:24
【问题描述】:

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

出现问题的“TM”字符是 \U0099 而不是通常的 \U2122
我再深入一点,发现“TM”字符\U0099属于极少数的中文字体。

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

我尝试扫描我的数据以查找“\U0099”并将其替换为 \U2122,但似乎 NSString 函数会自动转义 unicode 字符,因此这个“TM”字符甚至不会存在。

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

提前致谢

【问题讨论】:

  • \U0099 不是有效的 Unicode 字符。 \U0099 来自哪里?为什么没有使用正确的字符?
  • 来自客户端的数据库。客户位于亚洲,所以我假设他们有很多中文数据。 link 我知道您可以在其他语言的输入法中使用字符的变体。例如“,”和“,”
  • Unicode 是 Unicode,与语言或区域设置无关。 \U2122 是 TM 符号的唯一 Unicode 字符。可能是您的客户端使用了一些非 Unicode(或非 UTF)字符编码,导致 TM 符号被编码为十六进制值99,但它不会是\U0099。如果您知道数据的编码方式,您只需使用正确的编码从NSData 创建一个NSString
  • 我明白了。有趣的是,整个数据都是 UTF8 格式,其他一切都很好,期待这个 \U0099 字符,所以我不能真正将 NSData 转换为任何其他编码。非常感谢 rmaddy。
  • 如果他们使用了错误的字符,那么您需要将\U0099 字符的实例转换为\U2122。展示你到目前为止所做的尝试。

标签: ios objective-c unicode nsstring


【解决方案1】:

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

U+0099 是未分配的 Unicode 控制字符,它不是 TM 符号。如果将转义符放入文字中,则很难将此字符转换为 NSString 作为 Clang 至少对象,并且 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 库函数执行此操作可能更可靠。 Xcode 5.1.1 和 Clang 5.1 用于测试。

HTH

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      请注意,商标符号 ™ 在 Code Page 1252(常见的 Windows 字符集)中显示为十六进制 99。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 2020-06-19
        相关资源
        最近更新 更多