Objective C 中 unicode 字符的数值

2024-03-25

是否可以从 Objective-C 中的 unicode 字符获取数值?

@“A”是0041,@“➜”是279C,@“Ω”是03A9,@“झ”是091D...?


好的,所以也许值得在这里单独的答案中指出一些事情。首先,“角色”这个词是有歧义的,所以我们应该根据我们的意思选择一个更合适的术语。 (看字符和字素簇 http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Strings/Articles/stringsClusters.html在 Apple 开发人员文档以及统一码网站 http://unicode.org了解更多详情。)

如果您要求 UTF-16代码单元,那么你可以使用

unichar ch = [myString characterAtIndex:ndx];

请注意,这是only如果代码点位于基本多语言平面内(即小于 U+FFFF),则相当于 Unicode 代码点。

如果您需要 Unicode代码点,那么您应该知道 UTF-16 支持 BMP 之外的字符(即 U+10000 及以上),使用代理对。这样就会有twoU+10000 以上任何代码点的 UTF-16 代码单元。要检测这种情况,您需要执行类似的操作

uint32_t codepoint = [myString characterAtIndex:ndx];

if ((codepoint & 0xfc00) == 0xd800) {
  unichar ch2 = [myString characterAtIndex:ndx + 1];

  codepoint = (((codepoint & 0x3ff) << 10) | (ch2 & 0x3ff)) + 0x10000;
}

请注意,在生产代码中,您还应该测试并处理代理对以某种方式被截断的情况。

重要的,UTF-16 代码单元和 Unicode 代码点都不一定对应于最终用户视为“字符”的任何内容(Unicode 联盟通常将其称为字素簇以将其与“字符”的其他可能含义区分开)。例子有很多,但最容易理解的可能是组合变音符号。例如,字符“Ä”可以表示为 Unicode 代码点 U+00C4,或一对代码点 U+0041 U+0308。

有时人们(比如@DietrichEpp 在他的答案的评论中)会声称你可以通过在处理字符串之前转换为预组合形式来处理这个问题。这有点转移注意力,因为预组合形式仅处理在 Unicode 中具有预组合等效项的字符。例如它对所有组合标记没有帮助;它对印度语或阿拉伯语脚本没有帮助;它对 Hangul Jamos 没有帮助。还有许多其他案例。

如果你试图操纵字素簇(用户可能认为是“字符”的东西),你可能应该使用 NSString 方法-rangeOfComposedCharacterSequencesForRange:, rangeOfComposedCharacterSequenceAtIndex:或 CFString 函数CFStringGetRangeOfComposedCharactersAtIndex。显然,你不能将字素簇保存在整数变量中,并且它没有固有的数值;相反,它由一串代码点表示,而代码点又由一串代码单元表示。例如:

NSRange gcRange = [myString rangeOfComposedCharacterSequenceAtIndex:ndx];
NSString *graphemeCluster = [myString substringWithRange:gcRange];

注意graphemeCluster可以是任意长(!)

即便如此,我们仍然忽略了 Unicode 对双向文本的支持等问题的影响。也就是说,NSString 中的代码单元表示的代码点的顺序may在某些情况下,结果可能与您的预期相反。最糟糕的情况涉及嵌入阿拉伯语或希伯来语的英文文本;这is由 Cocoa Text 系统支持,因此您实际上可以在代码中得到双向字符串。

总结一下:一般来说,应该避免检查NSString and CFString实例 unichar by unichar。如果可能的话,使用适当的NSString方法或CFString函数代替。如果你do如果您正在研究 UTF-16 代码单元,请先熟悉 Unicode 标准(如果您无法阅读 Unicode 书籍本身,我建议您阅读《Unicode 揭秘》),这样您就可以避免重大陷阱。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective C 中 unicode 字符的数值 的相关文章

  • 更改导航项(栏)的背景颜色

    有没有一种简单的方法可以更改视图顶部导航项的背景颜色 我有一个基于导航的应用程序 我只希望一个视图获得另一种背景颜色 我主要使用 IB 创建视图 我找到了以下解决方案 未测试 float r 10 float g 55 float b 13
  • Objective-C 中是否有命名初始化方法的约定?

    在可以通过不同的 init 方法初始化的 Objective C 类中 将所有初始化程序共用的初始化代码收集到一个从其他 init 方法 有时也从从 Nib 唤醒 是否有关于如何命名该方法的约定 初始化器 初始化公共 根据 Apple 的说
  • ARC 不允许将 Objective-C 指针隐式转换为“void *”

    这意味着什么 我有什么选择 ARC 不允许将 Objective C 指针隐式转换为 void 我正在将 Xcode3 项目移植到 iOS5 它使用 AudioSessionInitialize 如下 AudioSessionInitial
  • 沙盒尝试恢复消耗性 IAP

    我一直在尝试在 iOS 上测试一些消耗性 IAP 但遇到了一个奇怪的错误 弹出一条警报 其中包含以下文本 此应用内购买已被购买 它将恢复为 自由的 环境 沙盒 我已经检查过 并且确定我的 IAP 可以在 iTunesConnect 中使用
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • 自定义 UITableViewCell 选择样式?

    当我点击我的UITableViewCell 当我单击单元格时 背景部分 我的背景图像未覆盖的区域 会变成蓝色 另外 所有的UILabel单击时单元格上的 s 变为白色 这就是我想要的 然而 我不想要的是当我点击它时的蓝色背景 但如果我这样做
  • 如何解决 CoreData mogenerator 未找到问题

    我收到如下所示的错误 我不知道我错过了什么 我该如何解决这个问题 如下图所示 Users nischalhada Documents XcodePro mnepalnews revisited 2 0 CoreData mogenerato
  • 在 Swift 中使用 CommonCrypto 解密时出现问题

    我在一家Swift only加密 解密Extension for String and NSData 并且 crypt 部分的工作基于 Zaph 在链接问题中提供的答案 在 Swift 中使用 CCCrypt CommonCrypt 时出现
  • 如何在 SVG 中显示 unicode?

    以 SVG 格式存储在数据库中的信息 如果数据包含文本 它将显示为 Unicode 有必要在浏览器中正确显示 SVG 文件
  • iphone:如何停止快门动画?

    我有两个问题 1 我想知道如何在相机加载时停止快门动画 我正在使用 UIImagePickerController 我已经参考了堆栈溢出的许多答案 但没有成功 2 我在相机中有一个自定义按钮 使用cameraOverlayView并想通过单
  • 在 UIImage 顶部绘制透明圆圈 - iPhone SDK

    我在尝试找出如何在 UIImageView 中的 UIImage 顶部绘制透明圆圈时遇到了很多麻烦 谷歌给了我线索 但我仍然找不到有效的例子 有没有人知道的例子可以证明这一点 最简单的方法就是创建一个半透明的方形 UIView 然后将其图层
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 为沙盒 Cocoa 应用程序创建临时文件

    我的应用程序是沙箱化的 根据最新的应用程序商店指南 我想创建一些临时文件 我可以这样做吗 如果 是 我可以在哪里这样做 有没有预先指定的路径 还有访问该路径的命令 您应该使用NSTemporaryDirectory 函数 它将查找并返回适合
  • 在不同的捆绑包上测试 iPhone 应用内购买?

    我们有一组 iPhone 应用程序的 Beta 测试人员 最近 我们在应用程序中添加了应用内购买功能 在此之前 我们会使用单独的捆绑 ID 和名称向 Beta 测试人员发送临时版本 以便他们可以在手机上拥有商店版本和临时版本 然而 似乎我们
  • Objective-C中如何使继承的类能够看到父类的隐藏方法[重复]

    这个问题在这里已经有答案了 我有两个类 Class1 和 Class2 第二个类继承自第一个类 我需要重写 Class1 的 update 方法来实现我的目标 继承方法中 update方法的改变是在代码中间进行的 所以我不能使用 超级更新
  • ViewWillAppear 没有被 UISplitViewController 调用

    背景和目标 我有一个基于 UISplitViewController 的 iPad 应用程序 到目前为止它支持 4 个方向 但现在我想将其锁定为仅横向 我变了shouldAutorotateToInterfaceOrientation左视图
  • 为什么使用[ClassName alloc]而不是[[self class] alloc]?

    我正在读马克 达尔林普尔 Mark Dalrymple 的著作在 Mac 上学习 Objective C 仅在协议章节 所以仍然相对较新 并试图弄清楚一些事情 为什么要通过类自己的名称来引用它 如果我有一个叫做Foo 为什么我会想写 比如说
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • UISplitViewController - 推送模态视图

    使用 UISplitViewController 时推送模态视图的最佳实践是什么 您会从 RootViewController DetailViewController 还是直接从应用程序委托推送 理想情况下 我想要实现的功能是在基于某些条

随机推荐

  • 如何使Spring缓存中的缓存名称可配置?

    我们使用 Spring 缓存框架进行缓存 并且希望能够支持多个缓存命名空间 例如 book 或 isbn 并且缓存命名空间是可配置的 而不是硬编码在类中 例如具有 Cacheable book isbn public Book findBo
  • JavaScript:内联函数与预定义函数

    任何人都可以向我提出一些关于使用的论据吗内联函数反对通过预定义函数给一些处理程序的名字 IE 哪个更好 function setTimeout function some code here 5 versus function functi
  • Android 2.2异常处理,catch参数null

    我想知道是否有人遇到奇怪的行为 我有 try catch 块 其中 catch 语句分配一个异常变量以使我能够正确处理异常 我得到的是 catch Exception ex 语句中的 ex null 请问我做错了什么 public clas
  • 如何读取用逗号分割的 CSV 文件,除非它是字段的一部分[重复]

    这个问题在这里已经有答案了 我有以下 C 代码 它读取 CSV 文件 目标是将其保存到 SQL 表中 StreamReader sr new StreamReader tbCSVFileLocation Text ToString stri
  • 在 google Drive api 的根目录中创建文件夹并将文件上传到该文件夹

    我想使用 CURL 在 google 驱动器根目录中创建文件夹 文件已上传到驱动器 但我需要创建一个文件夹并将文件上传到该文件夹 根据 hanshenrik 代码 创建文件夹正在工作 移动文件不起作用 我更新的代码 REDIRECT URI
  • 将列与 t-sql 中的值列表进行比较

    我正在页面上显示记录 并且我需要一种方法让用户选择要在另一个页面上显示的记录的子集 这些记录不存储在任何地方 而是动态生成的 在 sql 中说明 uniqueid 位于此 id 列表中而不是表等中的位置的最佳方法是什么 我知道我可以使用一堆
  • 模板化类专门化,其中模板参数是模板

    我想知道类似的事情是否可能 基本上 我有一个模板类 它偶尔会采用模板类的对象 我想将它 或只是一个成员函数 专门用于特定的模板类 但该类的 通用 形式 template
  • 如何在 C# 中关闭*多显示*?

    关于 如何在c 中关闭显示器 的文章有很多 但都是关闭所有显示器 有没有可能的方法来关闭特定的监视器 一些研究引导我来到这里 http www codeguru com forum showthread php p 1011720 post
  • 专有的 Haskell 库

    我对 Haskell 有点陌生 已经在业余项目中使用它几个月了 我想编写一个 C 库的 Haskell 接口 所有代码都是专有的 而不是开源的 所以我的问题是 如果我最终将其分发给客户并且不想提供源代码 而是提供诸如共享库之类的东西怎么办
  • 如何在未迁移到Androidx的项目中使用Androidx库

    我目前的项目还是比较稳定的 目前我不想迁移到 Androidx 但我需要用这个com pierfrancescosoffritti androidyoutubeplayer core 10 0 3我的项目中的图书馆 已迁移至 Android
  • 使 IE 中的内容不可选择

    这是我用 JS 写的图表 http jsfiddle net 49FVb http jsfiddle net 49FVb The css moz user select none khtml user select none 在 Chrom
  • Cassandra 3.9 和 CQL 规范版本

    只是好奇 Cassandra 3 9 支持哪些版本的 cql 我知道Cassandra 3 9支持cql 3 4 2 但是3 4 3是否也支持 以及如何升级 配置 Cassandra 3 9 以使用 cql 3 4 3 我在网上搜索了一下
  • 使用 C++ 连接到 MySQL 服务器

    我正在尝试使用 C 和 Visual C 2008 Express Edition 上的 MySQL ODBC 5 1 驱动程序连接到 MySQL 服务器 我按照 MSDN 中的这些说明进行操作 SQL连接 http msdn micros
  • 在 pandas 中指定 read_sql 的数据类型

    我想指定执行 pandas read sql 时返回的数据类型 我特别感兴趣的是节省内存并将浮点值返回为 np float32 而不是 np float64 我知道我可以随后使用 astype np float32 进行转换 但这并不能解决
  • 编译器无法识别我的 C++ 类 - 循环依赖

    有这个基类 Core hpp ifndef C3 CORE HPP define C3 CORE HPP include
  • Ruby:如何对字符串进行排序,同时保留一些字符?

    我是 Ruby 的新手 我想对字符串进行排序 但保留非字母数字字符 例如 hello sally seen 10 dec 2016 gt ehllo allsy eens 01 cde 0126 我尝试过这样做 word scan w co
  • C# - 如何更改 PNG 质量或颜色深度

    我应该编写一个程序 从用户那里获取一些 PNG 图像 进行一些简单的编辑 例如旋转 并将它们保存在 JAR 文件中 以便它可以使用图像作为资源 问题是 当我打开一个 80kb 图像 然后用 C 保存它时 我会得到一个具有相同质量但占用 13
  • 为什么 Maven 依赖项的顺序很重要?

    以前我认为 Maven 依赖项的顺序并不重要 并认为这是它的优点 这是我的旧pom xml的依赖关系
  • ValueError:列的长度必须与键的长度相同

    我运行下面的代码时遇到问题 数据是我的数据框 X 是列车数据的列列表 L 是具有数值的分类特征列表 我想对我的分类特征进行热编码 所以我这样做 但是会抛出 ValueError 列的长度必须与键相同 对于最后一行 经过长时间的研究我仍然不明
  • Objective C 中 unicode 字符的数值

    是否可以从 Objective C 中的 unicode 字符获取数值 A 是0041 是279C 是03A9 是091D 好的 所以也许值得在这里单独的答案中指出一些事情 首先 角色 这个词是有歧义的 所以我们应该根据我们的意思选择一个更