c - 在 Linux 上将 iconv 与 WCHAR_T 一起使用
问题描述
我在 Linux 上有以下代码:-
rc = iconv_open("WCHAR_T", SourceCode);
在使用 iconv 将数据转换为宽字符串 ( wchar_t
) 之前。
我试图了解它实现了什么,以便将其移植到参数 1 上的选项"WCHAR_T"
不存在的平台。
这导致子问题,例如:
wchar_t
在 Linux 上是否有单一的表示?- 这使用什么代码页?我想也许是 UTF-32
- 它是否依赖任何语言环境设置来实现这一点?
我希望得到一个类似这样的答案:“您显示的代码是执行以下两件事的速记......”然后我可能可以执行这两个步骤,而不是平台上的速记"WCHAR_T"
选项iconv_open
不存在。
解决方案
存在(非标准)WCHAR_T
编码的原因是为了便于将指针wchar_t
转换为指向指针char
并将其与iconv
. 该编码所理解的格式是系统的本机格式wchar_t
。
如果您询问的是 glibc 而不是其他 libc 实现,那么在 Linux 上wchar_t
是系统本机字节序中的 32 位类型,并表示 Unicode 代码点。这与 不同UTF-32
,因为UTF-32
通常具有字节顺序标记 (BOM),如果没有,则为大端。 WCHAR_T
始终是本地字节序。
请注意,某些系统对wchar_t
. Windows 始终使用使用 little-endian UTF-16 的 16 位类型。如果您在该平台上使用 GNU libiconv,WCHAR_T
编码将与您在 Linux 上运行时不同。
语言环境设置不会影响wchar_t
,因为wchar_t
在编译时必须知道 的大小,因此实际上不能根据语言环境而变化。
如果这段代码确实将一个指针转换为指向wchar_t
并在其对 的调用中使用它iconv
,那么您需要调整代码以使用其中一种编码UTF-16LE
、UTF-16BE
、UTF-32LE
或UTF-32BE
,具体取决于sizeof(wchar_t)
平台的字节序。这些编码不需要(也不允许)BOM,并且假设您没有使用 PDP-11,其中一种编码对于您的平台是正确的。
如果您从其他来源获取数据,那么您需要弄清楚那是什么,并使用上面列表中的适当编码。您还应该向上游发送补丁,并要求维护者使用不同的、更正确的编码来处理他们的数据格式。
推荐阅读
- docker - 无法在 dockerfile 中安装 iputils 和 net-tools
- javascript - 如何在javascript中显示选定的元素
- flutter - Flutter - 从模拟器中完全卸载应用程序
- neo4j - 密码查询:根据其他属性关系的聚合设置关系上的属性
- c# - AutoUpdater.NET 不更新也不删除旧程序
- python - 从泡菜文件上传图表时出现问题
- php - 在 php 应用程序中存储 AES 加密密钥的最佳方法是什么?
- openoffice-calc - 将单元格中的数据拆分为新列 Openoffice Calc
- wpf - visual studio 2019 不显示添加新项目报告 rdlc
- codenameone - 代号一中的 Stomp 协议