如何使用 std 库在 Linux 上将 utf-16 转换为 utf-32?

2023-11-24

在 MSVC 上,使用 C11 将 utf-16 转换为 utf-32 很容易编码cvt_utf16语言环境方面。但在 GCC (gcc (Debian 4.7.2-5) 4.7.2) 中,这个新功能似乎还没有实现。有没有办法在没有 iconv 的 Linux 上执行此类转换(最好使用 std 库的转换工具)?


将 UTF-16 解码为 UTF-32 非常容易。

您可能希望在编译时检测您正在使用的 libc 版本,并在检测到损坏的 libc(没有您需要的函数)时部署您的转换例程。

Inputs:

  • 指向源 UTF-16 数据的指针 (char16_t *, ushort *, - 为了方便UTF16 *);
  • 它的大小;
  • 指向 UTF-32 数据的指针 (char32_t *, uint *- 为了方便UTF32 *).

代码如下:

void convert_utf16_to_utf32(const UTF16 *input, 
                            size_t input_size, 
                            UTF32 *output) 
{
    const UTF16 * const end = input + input_size;
    while (input < end) {
        const UTF16 uc = *input++;
        if (!is_surrogate(uc)) {
            *output++ = uc; 
        } else {
            if (is_high_surrogate(uc) && input < end && is_low_surrogate(*input))
                *output++ = surrogate_to_utf32(uc, *input++);
            else
                // ERROR
        }
    }
}

剩下的就是错误处理。您可能想要插入一个U+FFFD¹ 进入溪流并继续前进,或者只是退出,完全取决于您。辅助功能很简单:

int is_surrogate(UTF16 uc) { return (uc - 0xd800u) < 2048u; }
int is_high_surrogate(UTF16 uc) { return (uc & 0xfffffc00) == 0xd800; }
int is_low_surrogate(UTF16 uc) { return (uc & 0xfffffc00) == 0xdc00; }

UTF32 surrogate_to_utf32(UTF16 high, UTF16 low) { 
    return (high << 10) + low - 0x35fdc00; 
}

1 参见统一码:

  • § 3.9 Unicode 编码形式(使用 U+FFFD 的最佳实践)
  • § 5.22 U+FFFD 替换的最佳实践

² 还要考虑到!is_surrogate(uc)分支是迄今为止最常见的(以及第二个 if 中的非错误路径),您可能需要使用以下命令对其进行优化__builtin_expect或类似的。

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

如何使用 std 库在 Linux 上将 utf-16 转换为 utf-32? 的相关文章

  • 如何创建语法突出显示文本框[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何使用 C Net 创建语法突出显示文本框 Take 闪烁网 http scintillanet codeplex com 并采取其
  • 表达式访问者仅为某些 lambda 表达式调用 VisitParameter

    我希望能够使用嵌套扩展方法将 EF 中的实体投影到相应的视图模型 参见我之前的问题使用扩展方法在 EF 中投影单个实体 https stackoverflow com questions 39585427 projection of sin
  • 更改图像颜色与透明背景

    我需要使用 c System Drawings 将透明背景上带有绿色圆圈的图像加载到位图图像中 这是最简单的部分 但是 我需要在将其添加到更大的图像之前更改圆圈的颜色 而不影响周围的透明度 就我而言 我需要将圆圈颜色更改为黄色并将其添加为太
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • C 链表销毁函数

    我正在尝试学习 C 和很多人一样 我对指针有点困惑 无论如何 我创建了一个递归函数来销毁我的链表 但是正如我调试的那样 当我从函数返回时 列表的头部不应该为空 所以我猜这是对指针的一些基本误解 这是函数 void destroy struc
  • 使用 LINQ 展平嵌套字典

    所以我有一本形式的字典Dictionary
  • 为什么GCC编译的应用程序总是包含_mcount符号?

    库并不总是包含 mcount 符号 但应用程序包含 您可以使用 gobjdump 或 nm 实用程序验证这一点 我读过 mcount 用于实现分析 但即使禁用分析并启用优化 O2 该符号仍然存在 它还有其他额外的用途吗 更新 我使用的是 S
  • 是否自初始化 'A a = a;'允许吗?

    此代码在运行时在复制构造函数中失败 但编译器 MSVS2008 没有发出警告 您能解释一下 最好引用标准 这段代码是否非法或什么 我理解 A a a 永远不应该写在第一位 但我正在寻找理论背景 class A public A p new
  • 使用 FromBase64Transform 解码 base64 文件流

    The example https msdn microsoft com en us library system security cryptography frombase64transform 28v vs 110 29 aspx从M
  • 解析连接字符串

    是否有标准库或代码片段可以使用这样的连接字符串获取值 string connstr DataServiceUrl http localhost foo RemoteServerConnection server http localhost
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 如何在realm-dotnet中存储System.Collections.Generic.Dictionary

    我正在尝试将 Realm NET 集成到我的 uwp 项目中 我想知道是否有任何方法可以在 Realm dotnet 库中存储 System Collections Generic Dictionary 我试过这个 public class
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • Membership.ValidateUser() 的目的是什么

    我一直在学习有关MembershipProvider类 我认为Membership ValidateUser 方法应该用于登录用户 然而我刚刚了解到有一个FormsAuthentication Authenticate 目的是什么Valid
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • Selenium - 模式对话框存在 - 如何接受信息?

    我有以下问题 在页面上提交一些日期后 我有一个如图所示的模式对话框 我想单击 ENTER 来浏览该模式 但它不起作用 我有以下代码 driver FindElement By CssSelector input submit Click A
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 从 C/C++ 程序进行 Ping

    我想编写一个 C 或 C 程序 给定一个 IP 地址 对其进行 Ping 然后根据 Ping 是否成功执行进一步的操作 这个怎么做 尽情享受Ping 页面 http www ping127001 com pingpage htm 其中有一个

随机推荐

  • 使用 lift-json 将 Json 值提取为 Map

    lift json 的文档表明我应该能够调用 values 来获取当前的 JObject 结构作为普通的 Scala Map 这种方法对我来说不起作用 因为 值 的返回类型是 json Values 而不是示例所示的 Map 我究竟做错了什
  • 运算符“>=”不能应用于“string”和“string”类型的操作数

    我在 C 中使用实体框架 我的代码是 var result ef services Where entry gt entry tarikhservice gt textBoxX1 Text entry tarikhservice lt te
  • AWS Athena (Presto) OFFSET 支持

    我想知道 AWS Athena 是否支持 OFFSET 对于 mysql 以下查询正在运行 但在 athena 中它给了我错误 任何例子都会有帮助 从员工中选择 其中 empSal gt 3000 LIMIT 300 OFFSET 20 A
  • 如何自定义 Hibernate @Size 错误消息以指示输入字段的长度

    我想自定义文本字段的错误消息以包含输入的实际字符数 我已经能够做到这一点 但对我的解决方案不满意 所以我想知道其他人做了什么来实现这一目标 春季4 1 2 休眠4 3 10 休眠验证器 5 1 3 字段注释 出于测试目的 仅限 10 个 实
  • 应用程序在 CoreData 保存时冻结

    我有一个 iPhone 应用程序 在保存 CoreData 时有时会冻结 然后不会重新启动 我确实有第二个线程使用数据库 但我认为我已经遵循该模式为该线程创建单独的上下文 这是重新启动后的崩溃报告 有任何想法吗 我尝试将其更改为仅使用一个线
  • Android OpenGL ES 2.0 内存中仅限制 16 个纹理?

    基本上 当我在 Android Studio 中使用 OpenGL ES 2 0 开发应用程序时 我遇到了一个无法解决的大问题 并且它已经困扰我大约一周了 因此 每当我在内存中加载超过 16 个 可能是 17 个任意大小的纹理 并尝试通过
  • iomanip 函数是如何实现的?

    一些标准iomanip函数带有一个参数 我想知道这是如何实现的 例如 我可以用函数做类似的事情吗 这确实是我需要的解决方案这个答案 但我不知道该怎么做 当我查找定义时setw函数例如在http en cppreference com它将返回
  • 多个下拉按钮 – 一次只能打开一个(JS/jQuery)

    我一直在尝试创建两个语言选择下拉按钮 我成功使用了这个 W3Schools 模板 然而 这个解决方案有两个缺点 1 您需要 每个下拉按钮一个脚本或对该脚本的修改 2 你可以同时打开两个下拉按钮 这是我不想要的 我找到了类似问题的解决方案he
  • Visual Studio 中 Ajax 和 JavaScript 库的 IntelliSense

    我知道使用 vsdoc js 文件智能感知 并且 jQuery 的那个很容易找到 还有哪些其他 JavaScript Ajax 和 DHTML 库拥有这些文件 在哪里可以找到这些文件 另外 是否有一个文档概述了 vsdoc js 文件的规范
  • 取消设置会话变量时出现问题

    我的网站上有一个用于邀请朋友的表格 这是一个简单的文本字段和一个提交按钮 如果出现错误 我会重定向回此页面并显示错误消息 如果它们是会话变量集 if isset SESSION invite error echo SESSION invit
  • 为什么我会收到关于初始化器不是常量的错误?

    我正在使用以下代码 const int X ORIGIN 1233086 const int Y ORIGIN 4728071 const int Z ORIGIN 4085704 const int xyzOrigin NUM DIMEN
  • Google App Engine 模型的自定义键 (Python)

    首先 我对 Google App Engine 还比较陌生 所以我可能做了一些愚蠢的事情 假设我有一个 Foo 模型 class Foo db Model name db StringProperty 我想用name作为每个人的唯一钥匙Fo
  • 如何在 C# 中返回通用列表集合?

    我有一些 linq to sql 方法 当它执行查询时 它返回一些匿名类型 我想将该匿名类型返回到我的服务层以对其执行一些逻辑和操作 虽然我不知道怎么退货 我以为我能做到 public List
  • 在 PyQt 中重写 QPaintEvents

    我正在尝试创建一个带有分隔线的 TextEdit 小部件 首先 我创建了一个MyTextEdit类 作为一个子类QTextEdit 并覆盖其paintEvent method import sys from PyQt4 QtGui impo
  • CUDA编译器无法编译简单的测试程序

    我正在尝试获取 NVIDIA 的 CUDA 设置并将其安装在我的配有 NVIDIA GEFORCE RTX 2080 SUPER 显卡的电脑上 经过几个小时的尝试不同的事情和大量的研究后 我已经让 CUDA 使用命令提示符工作 尽管尝试在
  • 如何在android中的自定义列表视图中单击按钮和列表视图项目单击

    我的列表视图中有 4 个项目 其中 3 个是文本视图 一个是按钮 在我的情况下 我必须从单个列表中打开 2 个新活动 从按钮第一次点击开始 从列表视图项目中单击第二个 但是当我在列表视图列表中添加按钮时 列表单击不起作用 我也无法处理按钮的
  • “预期位于:/usr/lib/libc++.1.dylib”:在 M1 MacBook Pro 上安装 Tensorflow

    我正在尝试在带有 M1 芯片的 MacBook Pro 上安装 Tensorflow 我的 MacBook 的操作系统是 MacOS Big Sur 版本 11 0 为了安装 Tensorflow 以便将其与 Python 一起使用 我遵循
  • 如何获取键盘的高度?

    不同 iOS 设备上的键盘高度有所不同 有谁知道如何以编程方式获取设备键盘的高度 Swift 您可以通过订阅来获取键盘高度UIKeyboardWillShowNotification通知 假设您想在显示之前知道高度是多少 Swift 4 N
  • 为锚点窗格设置类控制器

    使用 JavaFX Scene Builder 时遇到以下问题 Given 一个文件fxml 包含描述Anchor Pane 由场景生成器形成的fxml 对于锚点窗格没有指定控制器类 使用 FXMLLoader 将此 fxml 加载到 Ja
  • 如何使用 std 库在 Linux 上将 utf-16 转换为 utf-32?

    在 MSVC 上 使用 C11 将 utf 16 转换为 utf 32 很容易编码cvt utf16语言环境方面 但在 GCC gcc Debian 4 7 2 5 4 7 2 中 这个新功能似乎还没有实现 有没有办法在没有 iconv 的