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

时间:2011-08-15 04:24:53

标签: iphone character-encoding nsstring nethack

我希望能够在我的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上我可以播放Nethack,终端字体设置为Courier New,我可以设置DECgraphics并且显示正常。

所以问题是:

  • 上面的代码出了什么问题?
  • 有哪些免费的monospaced truetype字体支持DEC特殊字符和/或代码页437?
  • 一旦你确定了这些字形,你怎么能测试TTF?
  • 如何在UILabel或类似字体中显示这些字形?

(我不想使用任何可用的图形图块集,我不喜欢它们。我知道至少有两个Nethacks已经免费提供,但没有一个具有我想要的直接键盘接口,我发现弹出一个窗口,让一切都变得非常缓慢和令人沮丧。我知道这不是一个简单的项目。我可能有一天会想到Angband。)

1 个答案:

答案 0 :(得分:3)

CP437中的大多数(全部?)字形在Unicode标准中都有相应的代码点,详见本维基百科article

例如,要显示球杆,您可以执行以下操作。它适用于默认的UILabel字体:

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