c++ - MultibyteToWideChar 字节边界
问题描述
我正在尝试使用MultibyteToWideChar
该函数支持的任何编码将某些文本转换为另一种编码,例如UTF-8
.
问题是,MultibyteToWideChar
当沿字符边界使用时,只会报告错误,但不会指示它在哪个字符处失败。拿着这个:
tes字hello
并说它是UTF-8
。我想把它转换成UTF-16
.
现在对于我的情况,我读了 4 个字节。然后,我调用MultibyteToWideChar
这 4 个字节。好吧,亚洲字符分为两个边界。
现在MultibyteToWideChar
会失败,并且不会告诉我哪个字节失败了,所以我可以重新调整。
我读了 4 个字节或 bufferSize 字节,因为我有流数据。
我已经使用iconv进行编码转换,但它太慢了。
我也用过ICU,它很快,但完全修剪后,它的大小仍然是 6.5MB,太大了。
是否有另一种解决方案也快速但体积小并支持广泛的编码?
我也尝试过 CharNextExA 函数等,但它们不适用于其他编码。
函数的返回值只返回字符,所以不知道转换了多少字节。多字节字符的长度可能不同。我需要转换的字节数,因为这样我可以将这些字节复制到下一个缓冲区中以供重用。
我正在尝试做的是以块的形式读取一个非常大的文件,并将该文件编码转换为 UTF-8
注意:
我很好奇,ICU4C 是如何工作的?基本上,我将源文件复制过来,但开箱即用它只支持像 UTF-8 这样的编码,但不支持 Big5。要添加 Big5,我必须创建一个 5MB 的 .data 文件,然后将其发送到 ICU4C,然后 Big5 可用。问题是,我不认为 .data 文件是代码。因为当为 x64 编译时,它在 x86 上工作得非常好。有没有办法避免 5MB?
解决方案
我不认为有一个单一的功能解决方案。
如果不使用 3rd-party 库,您可能会遇到以下问题:
- 将一个字节读入缓冲区。
- 如果
IsDBCSLeadByteEx
为真,则将下一个字节附加到缓冲区。 - 打电话
MultiByteToWideChar
。如果失败,则尾随字节(如果有)不正确。
请注意,IsDBCSLeadByteEx
它不支持 Unicode,因此当代码页为 UTF-8 时,您需要自行处理长度,直到缓冲区包含一个完整的代码点。
推荐阅读
- postgresql - 如何在 whereIn 语句中使用多个列?
- laravel - 在 laravel 的 vue 组件中引用图像的正确方法
- c# - “TextMeshPro/Distance Field”中的着色器错误:无法打开源文件:第 126 行的“TMPro_Properties.cginc”(在 d3d11 上)
- python - 在 python/pandas 中创建关于客户首次购买日期的重复购买矩阵
- excel - 在 Windows excel 等 Unix 服务器中创建交互式数据透视表
- php - 选择选项中的多级类别
- ruby-on-rails - Ruby 没有创建新项目
- amazon-web-services - 在 Cloudformation 模板中,如何在 IoT 规则中引用动态生成的 Lambda 函数 ARN?
- python - python flask:使用全局应用对象共享数据
- apache-kafka - Kafka seekToEnd 没有将指针移动到主题的末尾