【问题标题】:How to convert numeric input into an NSString containing an umlaut? (etc.)如何将数字输入转换为包含变音符号的 NSString? (ETC。)
【发布时间】:2014-02-19 18:03:47
【问题描述】:

要将 97 到 122 范围内的数字十进制值 x 转换为代表该 ASCII 字符的NSString,可以简单地调用:

[ NSString stringWithFormat: @"%c", x ]

如何为非 ASCII 字符创建一个 NSString,例如:

ä、è、ñ、à、é、ç、ĝ、ŝ、š、ĥ、þ、ð、ĵ、ü、ś、ź、ż

来自严格的数字输入值? (例如十进制 UInt32,而不是从查找表中复制或需要任何其他 NSString、Objective-C 或 Core Foundation 数据类型)。

是否有一些在线工具可以查找每个字符所需的魔法十进制数值(UTF-foo?)?

【问题讨论】:

  • 使用%C 而不是%c%C 支持更大的范围。
  • 您的问题不一致。如果您想要没有“查找表”的字符,您希望在哪里找到您的数字?我的意思是你可以在online tables 中找到代码,但是如果你可以简单地将它们输入到 NSString 文字中,为什么还要查找它们呢?
  • 不要忘记第 2 部分:是否有在线实用程序来查找 %C 所需的“神奇”十进制常量?或者可以使用几行 javascript 在 Web 浏览器中本地完成查找吗?
  • @HotLicks:我是通过硬件链接传递固定长度的数值。 8 位 CPU 不知道 NSString 字面量。
  • 然后传递字符代码。如果您仅限于欧洲语言,您可能可以与 UTF16 相处得很好——字符为 16 位。

标签: objective-c nsstring utf


【解决方案1】:

如果你有 Unicode 值,那么你可以这样做

uint32_t code = 0x0125; // U+0125 is 'ĥ'
NSString *s = [[NSString alloc] initWithBytes:&code length:4 
                            encoding:NSUTF32LittleEndianStringEncoding];

这甚至适用于“基本多语言平面”之外的 Unicode,例如

uint32_t code = 0x01F604; // ? = SMILING FACE WITH OPEN MOUTH AND SMILING EYES

上面的代码假设整数以 little-endian 字节顺序存储(即 所有当前运行 iOS 或 OS X 的处理器的情况)。与字节顺序无关 方法是

uint32_t code = OSSwapHostToLittleInt32(0x0125);

在 Xcode 中,您可以在“字符查看器”中从 “编辑-> 特殊字符...”菜单。当然也有表 Unicode 6.3 Character Code Charts 的所有 Unicode。

【讨论】:

  • 或者你可以只在 NSString 文字中包含引号之间的字符。
  • @HotLicks OP声明他们有一个需要转换的数值。
  • 他们还说“如何为非 ASCII 字符创建 NSString,例如:...”
  • @hotpaw2:在 Xcode 中,转到“编辑 -> 特殊字符 ...”。弹出一个字符查看器。从左上角的弹出菜单中选择“自定义列表...”。添加“代码表-> Unicode”。现在选择字符查看器左侧的“Unicode”。 (比较 Nitin Gohel 对stackoverflow.com/questions/17781457/… 的回答)
【解决方案2】:

你可以使用

[NSString stringWithFormat:@"%C", ch ];

使用大写的 %C 表示 unicode 字符。见here

【讨论】:

  • 虽然我在评论中建议了这一点,但需要注意的是,这仅适用于 Unicode 值高达 \UFFFF 的字符。 Martin 的解决方案还可以处理更高的字符。
  • @rmaddy 对不起,我在完成我的评论之前没有注意到你的评论。
  • 我很确定,Martin 的 uint32_t 无法处理高于 0xffff 的 unicode 值。 ;-)
  • @AminNegm-Awad:这很有趣,是什么让你这么想? 0x01F604 大于 0xFFFF 并且我在发布之前测试了我的代码。 (顺便说一句,uint32_t 的最大可能值为 0xFFFFFFFF`)。
  • Boing 数错:16 而不是 32。
猜你喜欢
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
相关资源
最近更新 更多