首页 > 解决方案 > 在 Linux 上将 iconv 与 WCHAR_T 一起使用

问题描述

我在 Linux 上有以下代码:-

rc = iconv_open("WCHAR_T", SourceCode);

在使用 iconv 将数据转换为宽字符串 ( wchar_t) 之前。

我试图了解它实现了什么,以便将其移植到参数 1 上的选项"WCHAR_T"不存在的平台。

这导致子问题,例如:

我希望得到一个类似这样的答案:“您显示的代码是执行以下两件事的速记......”然后我可能可以执行这两个步骤,而不是平台上的速记"WCHAR_T"选项iconv_open不存在。

标签: clinuxcharacter-encodingwchar-t

解决方案


存在(非标准)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-16LEUTF-16BEUTF-32LEUTF-32BE,具体取决于sizeof(wchar_t)平台的字节序。这些编码不需要(也不允许)BOM,并且假设您没有使用 PDP-11,其中一种编码对于您的平台是正确的。

如果您从其他来源获取数据,那么您需要弄清楚那是什么,并使用上面列表中的适当编码。您还应该向上游发送补丁,并要求维护者使用不同的、更正确的编码来处理他们的数据格式。


推荐阅读