将 UTF-8 文本转换为 wchar_t

2023-12-21

我知道这个问题已经被问过很多次了,我确实阅读了一些答案,但是有一些建议的解决方案,我试图找出其中最好的解决方案。

我正在编写一个 C99 应用程序,它基本上接收以 UTF-8 编码的 XML 文本。

它的部分工作是复制和操作该字符串(查找子字符串,cat it,例如..)

因为我现在不想使用外部非标准库,所以我尝试使用 wchar_t 来实现它。

目前,我使用 mbstowcs 将其转换为 wchar_t 以便于操作,并且对于某些输入我尝试使用不同的语言 - 它工作得很好。

事实是,我确实读到有些人对 UTF-8 和 mbstowcs 有一些问题,所以我想听听这种使用是否被允许/可接受。

我面临的另一个选择是使用带有 WCHAR_T 参数的 iconv。问题是,我在一个平台(不是 PC)上工作,它的区域设置非常仅限于 ANSI C 区域设置。那个怎么样?

我也遇到过一些非常流行的 C++ 库。但我对 C99 的实现有限制。

另外,我会在另一个平台上编译此代码,其中 wchar_t 的 sizeof 不同(我的机器上为 2 字节与 4 字节)。我怎样才能克服这个问题?使用固定大小的字符容器?但是,我应该使用哪些操作函数呢?

很高兴听到一些想法。谢谢。


C没有定义什么编码char and wchar_t类型是,标准库只要求一些在两者之间转换的函数,而没有说明如何转换。如果依赖于实现的编码char则不是 UTF-8mbstowcs将导致数据损坏。

如中所述C99 标准的基本原理 http://www.open-std.org/jtc1/sc22/wg14/www/docs/C99RationaleV5.10.pdf:

然而,这五个功能往往限制性太强,而且太原始,无法开发管理字符的可移植国际程序。

...

C90 故意选择不发明更完整的多字节和宽字符库,而是选择等待它们的自然发展,因为 C 社区获得了更多关于宽字符的经验。

源自here http://www.open-std.org/jtc1/sc22/wg14/.

因此,如果您的文件中有 UTF-8 数据char没有标准的 API 方法可以将其转换为wchar_ts.

在我看来wchar_t除非必要,否则通常应该避免 - 例如,如果您使用 WIN32 API,则可能需要它。我不相信它会简化字符串操作。wchar_t在 Windows 上始终为 UTF-16LE,因此您可能仍需要多个wchar_t无论如何表示单个 Unicode 代码点。

我建议你调查一下重症监护室项目 http://site.icu-project.org/- 至少从教育的角度来看。

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

将 UTF-8 文本转换为 wchar_t 的相关文章

随机推荐

  • Angular ng build --target=product 给出错误

    我使用 Angular CLI 创建了一个新的 Angular 项目 我使用的版本是 Angular Cli 1 0 2 角度 4 0 0 我在其中添加了很多代码 但是现在 当我使用下面的命令构建我的项目时 我收到了一堆错误 ng buil
  • c 定义多行宏?

    define DEBUG BREAK a if a asm int 3 我已经按照上面定义了一个宏 并尝试使用它 include test define h int main DEBUG BREAK 1 1 return 0 但该示例无法编
  • 登录 Clojure

    对于Java开发 我使用Slf4j和Logback Logger logger LoggerFactory getLogger HelloWorld class logger debug Hello world 如何在 Clojure 程序
  • 使用 GDI+ 旋转图像而不剪裁其边缘的最快方法是什么?

    有一些非常漫长且饥饿的算法可以做到这一点 但到目前为止我还没有想出或发现任何特别快的算法 最快的方法是使用不安全调用直接操作图像内存LockBits 听起来很可怕 但其实很简单 如果您搜索 LockBits 您会发现大量示例 例如here
  • DevPay和Mfa是互斥的授权方式

    我尝试使用以下命令通过 AWS cli 将 MFA 删除添加到我的 S3 存储桶 aws s3api put bucket versioning bucket
  • 2D 软体:凝胶状和可塑性?

    我正在使用 Matter js 物理学来尝试创建软体 我能够创建这样的身体 但我不确定这是否是我想要的 软体 确实 这个物体并不完全是刚性的 并且在碰撞和被拖动时具有弹性的感觉 我一直在寻找与凝胶有相似之处的身体 这张图片可能在视觉上有助于
  • Pandas 分割错误

    由于内存不足 以下代码行未成功执行 import pandas as pd import datetime as dt u cols remote host dummy1 dummy2 date timezone get status by
  • PDO 错误:一般错误:2031 [重复]

    这个问题在这里已经有答案了 当我执行代码时出现此错误 我知道这已经在这里讨论过几次了 但我无法通过阅读那里提供的解决方案来解决我的问题 这是我得到的错误 致命错误 未捕获异常 PDOException 消息为 SQLSTATE HY000
  • 对于软件开发人员来说,学习如何对微控制器进行编程有多难?

    我是一名软件开发人员 我使用高级语言进行编程已有几年了 我想知道如何迈出硬件编程的第一步 不是什么疯狂复杂的东西 但也许是一些普通的 CE 设备 假设我不需要将 PCB 与各种组件放在一起 而只是对微型 cpu 进行编程 我要到多低的级别
  • 该算法的复杂度(Big-O)是多少?

    我对算法分析相当熟悉 并且可以说出我使用的大多数算法的大体 但我已经被困了几个小时 无法为我编写的这段代码想出 Big O 基本上 它是一种生成字符串排列的方法 它的工作原理是使字符串中的每个字符成为第一个字符 并将其与子字符串减去该字符的
  • 我可以在摘要式身份验证中使用已 MD5 编码的密码吗

    我在数据库中有密码的 MD5 哈希值 我想将其用于 HTTP AUTH DIGEST 但在阅读文档时 摘要哈希看起来包含用户名 领域和明文密码的哈希 在这种情况下有什么办法可以使用密码的 MD5 哈希吗 不 如果他们需要的哈希是这样生成的
  • Spark 结构化流:多个接收器

    我们使用结构化流从 Kafka 进行消费 并将处理后的数据集写入 s3 我们还想将处理后的数据写入 Kafka 是否可以通过同一个流查询来完成此操作 火花版本2 1 1 在日志中 我看到流式查询进度输出 并且我有来自日志的示例持续时间 JS
  • 分割字符串后将值插入表中

    我想将值插入员工表中 这些值是字符串格式的 分开 E g AA B 123 我使用以下函数分割它 CREATE FUNCTION db owner FN Split String varchar 8000 Delimiter char 1
  • 在异步方法中使用反射获取方法名称不会返回预期结果

    以下是我编写的一小段代码 用于演示此问题的基础知识 Code private async void Form1 Load object sender EventArgs e var result await TestAsyncMethodN
  • 查找鼠标相对于面板的位置

    我试图获取鼠标在面板中的位置 如面板左上角 x y 0 0 我目前所拥有的给出了整个屏幕上的位置 因此根据面板 位于框架中 在屏幕上的位置 坐标是不同的 我想你可以添加 x y 坐标来解决这个问题 但这似乎是一个混乱的解决方案 有人可以帮忙
  • 错误的身份验证数据 QuickBlox - Android

    我正在研究QuickBlox SDK http quickblox com developers SimpleSample users android Sign In 26 Social authorization 使用这个 SDK 我尝试
  • 可以使用 boost::threads 中的 std::this_thread* 函数吗?

    可以混合搭配来自的东西吗 boost thread and std thread 或者应该为每个函数使用一组函数 我问是因为我的代码使用boost threads 但我发现boost this thread sleep for设置系统时间时
  • 如何检查远程 git 存储库 URL 的有效性?

    在 bash 脚本中 验证 git URL 是否指向有效的 git 存储库以及脚本是否有权读取它的最简单方法是什么 应该支持的协议有git https and git 卷曲失败git 协议 email protected cdn cgi l
  • 如何导致 ldap_simple_bind_s 超时?

    最近 我们的测试 LDAP 服务器遇到了问题 它挂起并且无法响应请求 结果 我们的应用程序在尝试绑定时永远挂起 这仅发生在 Unix 机器上 在 Windows 上 ldap simple bind s大约 30 秒后呼叫超时 我不知道是不
  • 将 UTF-8 文本转换为 wchar_t

    我知道这个问题已经被问过很多次了 我确实阅读了一些答案 但是有一些建议的解决方案 我试图找出其中最好的解决方案 我正在编写一个 C99 应用程序 它基本上接收以 UTF 8 编码的 XML 文本 它的部分工作是复制和操作该字符串 查找子字符