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

我希望能够在我的 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。)

【问题讨论】:

    标签: iphone character-encoding nsstring nethack


    【解决方案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 的美丽(而且我害怕添加更多的条件编译),所以它可能必须是一个翻译表。
    最近更新 更多