如何将 UTF16 字符串解码为 Unicode 字符

2024-05-06

设备将字符串“????????”编码为"\uD83E\uDD1B\uD83C\uDFFD"。该字符串中表示的十六进制数字来自字符的 UTF-16 十六进制编码。 Unicode 代码点U+1F91B, U+1F3FD从 UTF-32 十六进制编码获取其数字。

就拿后面的这个来说,在 Swift 中我们可以做一个像这样的文字“\u{1F91B}\u{1F3FD}”,我们将得到预期的字符“????????”。

如何从 UTF-16 十六进制字符串转换"\uD83E\uDD1B\uD83C\uDFFD"得到“????????”?

我尝试获取字符串并将其转换为[UInt32]32 位整数数组,然后使用它创建 unicode 标量,但这仅适用于可以用单个 UTF-32 代码点表示的 Unicode 字符。

这是我正在使用的源代码。

extension String {

    func decodeBlock() -> String {
        let strings = self.components(separatedBy: "\\u")
        var scalars : [UInt32] = []
    
        var value: UInt32 = 0
        for string in strings {
            print(string)
            let scanner = Scanner(string: string)
            if scanner.scanHexInt32(&value) {
                scalars.append(value)
            }
        }
    
        let utf32chars = scalars
        var str = ""
        var generator = utf32chars.makeIterator()
        var utf32 : UTF32 = UTF32()
        var done = false
        while !done {
            let r = utf32.decode(&generator)
            switch (r) {
            case . emptyInput:
                done = true
            case .scalarValue(let val):
                str.append(Character(val))
            case .error:
                return "$"
            }
        }
        return str
    

        return self
    }
}

它改编自类似问题的答案中的代码。https://stackoverflow.com/a/41412056/731773 https://stackoverflow.com/a/41412056/731773

编码字符串的来源是 org.apache.commons.lang.StringEscapeUtilsescapeJava可以找到函数here https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringEscapeUtils.html#escapeJava(java.lang.String).


这有点作弊,但 UTF-16 恰好是NSString所以你可以借用以下方法NSString实现它:

extension String {
    func decodeBlock() -> String? {
        var chars = [unichar]()

        for substr in self.components(separatedBy: "\\u") where !substr.isEmpty {
            if let value = UInt16(substr, radix: 16) {
                chars.append(value)
            } else {
                return nil
            }
        }

        return NSString(characters: chars, length: chars.count) as String
    }
}

if let decoded = "\\uD83E\\uDD1B\\uD83C\\uDFFD".decodeBlock() {
    print(decoded)
} else {
    print("Cannot decode")
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 UTF16 字符串解码为 Unicode 字符 的相关文章

随机推荐

  • 用于生成 C++ 代码轮廓/图的工具 - 有这样的东西吗? [复制]

    这个问题在这里已经有答案了 我需要深入研究用 C 编写的软件组件并对其进行一些修改 我幻想生成一些代码映射 它将显示类之间的关系并引导我完成方法的流程 调用图 有这个工具吗 几年前 我使用 Rational Rose 建模工具 该工具具有对
  • API 与 SonarQube 5.6 和 Java Analyzer 4.0 与 Findbugs 3.3 或 Cobertura 1.6.3 不兼容

    SonarQube 对我的项目的分析失败了5 6 更新后Java插件从版本3 14 to 4 0 在我的 SonarQube 实例中 除了其他插件之外 我目前还有 Findbugs 插件 版本3 3 和 Cobertura 插件 1 6 3
  • 在 TensorFlow 中对伯努利随机变量进行采样

    给定一个包含伯努利分布均值的一维张量 如何使用给定的均值对相应的一维张量进行采样 TensorFlow 似乎只有random normal and random uniform实现的功能 我可以使用一些复杂的东西 例如 tf ceil tf
  • MonoGame真的跨平台吗?

    当我下载 MonoGame 我将使用它来代替 XNA 因为我使用的是 Mac 并解压它时 所有 MonoDevelop 解决方案文件都被命名为MonoGame Framework PLATFORM NAME sln with PLATFOR
  • 根据上一个 Flutter 的选择更改下拉按钮的选择

    我有2个DropdownButtonFormField我在那里可以选择汽车 我需要根据用户从 DropdownButtonFormField 中的第一个选择中选择的汽车型号来更改按钮的第二个选择 即 如果用户在第一个选择中选择梅赛德斯 则在
  • npm 安装 Angular/CLI 错误

    node v 8和 npm v5 正在尝试安装角度 cli从昨天开始全球范围内 每次都会遇到新的错误 Vipins Air vipingupta sudo npm install g angular cli npm 错误 代码 ETIMED
  • 将绝对路径和相对路径组合起来得到新的绝对路径

    我正在编写一个程序 其中一个组件必须能够采用给定的路径 例如 help index html or help 和基于该位置的相对路径 例如 otherpage index html or sub dir of help or help2 h
  • Django:什么时候运行 makemigrations?

    除了向模型添加 删除 修改字段之外 当我向模型添加或修改方法时 Django 还会检测到更改 所以我的问题是我应该跑步吗makemigrations每次我在模型中更改或添加新方法时 当您添加 更改模型方法时 您不需要运行 manage ma
  • Redis Docker compose无法处理RDB格式版本10

    我无法在 docker compose 文件中启动 redis 容器 我知道docker compose文件没问题 因为我的同事可以成功启动项目 我读到有一个删除 dump rdb 文件的解决方案 但我找不到它 我使用Windows机器 任
  • 验证准确性非常好,但预测很差

    我正在构建一个 keras 模型来对猫和狗进行分类 我使用具有瓶颈特征的迁移学习和 vgg 模型的微调 现在我得到了非常好的验证准确率 例如 97 但是当我进行预测时 我得到了关于分类报告和混淆矩阵的非常糟糕的结果 可能是什么问题呢 这是微
  • 如何删除 Objective-C 中的子视图?

    我已以编程方式将 UIButton 和 UITextView 作为子视图添加到我的视图中 notesDescriptionView UIView alloc initWithFrame CGRectMake 0 0 320 460 note
  • SQL Server 2000 - 将查询分成 15 分钟的块

    我有一个连续时间数据集 我想使用 sql 将其分成 15 分钟的块 如果我能帮忙的话 我不想必须创建一个新表才能做到这一点 i e 时间 计数09 15 109 30 309 45 010 00 210 15 3 有谁知道我该怎么做 我认为
  • 使用 Python 3.7+ 中的 wfastcgi 以及 Numpy、Pandas 等在 IIS 上部署 Python Flask 应用程序

    使用 wfastcgi 在 IIS 上部署 python 3 7 Flask 或 Dash 应用程序时 有许多很棒的教程可以让 hello work 程序正常运行 例如 https medium com bilalbayasut deplo
  • mongodb 备份是自动进行的吗?

    我们使用两个 mongodb 服务 现在 swisscom 开发者控制台中有一个备份按钮 我们是否必须使用此按钮手动进行备份 还是自动进行进一步备份 如果是 何时以及多久一次 我们会自动进行备份 但仅用于灾难恢复 我们不向客户提供此备份 所
  • 重用cocos2d动作

    是否可以 并且是一个好的实践 为使用相同操作的多个 CCSprite 重用相同的操作 因为如果我有 10 个 CCSprite 所有这些都需要缩放 我创建了一个名为scaleAction 的缩放操作 是否可以对精灵重复使用相同的动作 当我尝
  • 如何混淆整数?

    我需要从 C 中的整数列表生成唯一值的列表 我以为是 MD5 或类似的 但它们生成了太多字节 整数大小为 2 个字节 例如 我想获得单向通信 0 gt ARY812Q3 1 gt S6321Q66 2 gt 13TZ79K2 因此 在证明哈
  • 在 Unix 上查找不以特定扩展名结尾的文件名?

    有没有一种简单的方法可以递归地查找目录层次结构中的所有文件not以扩展名列表结尾 例如 所有非 dll 或 exe 的文件 UNIX GNU find 虽然功能强大 但似乎没有exclude模式 或者我错过了 而且我总是发现很难使用正则表达
  • 提取行 r 之间的数据

    我有以下行 rep c foo rep c A B 2 bar rep c C D 2 2 1 foo A B A B bar C D C D foo A 13 B A B bar C D C D 我想提取 foo 和 bar 之间的数据以
  • Pytest 插件:覆盖 pytest_runtest_call 和朋友

    我正在为我的一个项目使用 pytest 开发一个测试套件 由于项目的性质 我需要创建一个 Pytest 插件来控制测试的运行方式 它们不是在本地运行 而是发送到不同的进程来运行 我知道关于xdist但我认为这并不能解决我的问题 我一直在通过
  • 如何将 UTF16 字符串解码为 Unicode 字符

    设备将字符串 编码为 uD83E uDD1B uD83C uDFFD 该字符串中表示的十六进制数字来自字符的 UTF 16 十六进制编码 Unicode 代码点U 1F91B U 1F3FD从 UTF 32 十六进制编码获取其数字 就拿后面