在 UILabel 或类似中显示来自其他编码的“特殊”字符

Posted

技术标签:

【中文标题】在 UILabel 或类似中显示来自其他编码的“特殊”字符【英文标题】:Displaying 'special' characters from other encodings in UILabel or similar 【发布时间】:2011-10-27 01:31:54 【问题描述】:

我希望能够在我的 iPhone 上模拟一个终端,使用我在真实 DEC 终端上喜欢的原始图形玩 Nethack 之类的游戏。 Nethack 允许为 vt 兼容终端选择 DECgraphics 或为代码页 437 支持选择 IBMGraphics。

我知道这些特殊的图形字符是由发送到终端的字符串生成的(vt100.net有大量的信息,包括终端手册和测试程序)。我可以接收和解释这些字符串,但我需要能够在 UIView 中重现和显示这些字符。

看起来 kCFStringEncodingMacVT100 和 kCFStringEncodingDOSLatinUS 是解开谜题的关键。这是一些部分代码,显示了我尝试将“特殊字符”字形放到 UILabel 上的操作:

            UInt8 c = some value...
            NSStringEncoding stringEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingMacVT100);
            NSData *charData = [NSData dataWithBytes:&c length:1];
            NSString *charString = [[NSString alloc] initWithData:charData encoding:stringEncoding];
            label.font = [UIFont fontWithName:@"Courier New" size:20.f];
            label.text = charString;

我尝试了从 0 到 255 的 c 值。我可以使用此代码显示从空格到“~”的所有字符,但完全没有角或其他行字符。当没有字符显示时,charString 为 nil。

现在我很确定 Courier New TTF 有这些字符 - 在我的 Mac 上,我可以在终端字体设置为 Courier New 的情况下玩 Nethack,我可以设置 DECgraphics 并且显示正常。

所以问题是:

上面的代码有什么问题? 有哪些免费提供的等宽 Truetype 字体支持 DEC 特殊字符和/或代码页 437? 拥有 TTF 后如何对其进行测试以确保这些字形存在? 如何在 UILabel 或类似文件中显示这些字形?

(我不想使用任何可用的图形图块集,我不喜欢它们。我知道至少有两个免费的 Nethacks 可用,但没有一个具有我想要的简单键盘界面,我发现弹出一个窗口,所有方法都非常缓慢和令人沮丧。我知道这不是一个简单的项目。我可能想有一天去 Angband。)

【问题讨论】:

【参考方案1】:

CP437 中的大多数(全部?)字形在 Unicode 标准中都有对应的代码点,详见此 Wikipedia article。

例如,要显示一个俱乐部,您可以执行以下操作。它适用于默认的UILabel 字体:

UniChar club = 0x2663;
NSString *clubString = [NSString stringWithCharacters:&club length:1];
[label setText:clubString];

【讨论】:

您发布的代码似乎适用于不在 C0 控制范围内的所有字符(即 0x00 - 0x1F),但这对您没有帮助。你有什么理由反对翻译表?您不想成为将 Nethack 带入 21 世纪且完全符合 Unicode 标准的人吗? :) 我担心 21 世纪永远不会欣赏 Nethack 的美丽(而且我害怕添加更多的条件编译),所以它可能必须是一个翻译表。

以上是关于在 UILabel 或类似中显示来自其他编码的“特殊”字符的主要内容,如果未能解决你的问题,请参考以下文章

选框和静态 UILabel 文本

当 UILabel 文本长度较大时,UILabel 或 UIButton 类似于“查看更多”

从 UILabel 或 UITextField 更改 UIButton 的标题

无法在 Swift 中使用来自 Firebase 的数据立即加载 UIImageView 和 UILabel

限制 VoiceOver 从 UILabel 读取的文本

在钟面上旋转 UILabel