在Linux上将iconv与WCHAR_T一起使用

问题描述 投票:0回答:1

我在Linux上有以下代码:-

rc = iconv_open("WCHAR_T", SourceCode);

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

为了将其移植到不存在参数1 "WCHAR_T"上的选项的平台上,我试图了解它的作用。

这会导致子问题,例如:

  • 在Linux上是否有wchar_t的单一表示?
  • 这使用什么代码页?我想也许是UTF-32
  • 它是否依赖于任何语言环境设置?

我希望得到这样的答案:“您显示的代码是执行以下两项操作的简写...。”然后,我也许可以执行这两个步骤,而不必执行"WCHAR_T"上的iconv_open选项不存在的平台。

c linux character-encoding wchar-t
1个回答
0
投票

存在(非标准)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始终使用带有小尾数UTF-16的16位类型。如果在该平台上使用了GNU libiconv,则WCHAR_T编码将与在Linux上运行时的编码不同。

语言环境设置不会影响wchar_t,因为在编译时必须知道wchar_t的大小,因此实际上不会根据语言环境而变化。

如果这段代码确实是在将指针转换为wchar_t,并在其对iconv的调用中使用了指针,那么您需要调整代码以使用UTF-16LEUTF-16BEUTF-32LE编码之一]或UTF-32BE,具体取决于sizeof(wchar_t)和平台的字节序。这些编码不需要(也不需要)BOM,并且假设您未使用PDP-11,则其中一种对您的平台是正确的。

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

© www.soinside.com 2019 - 2024. All rights reserved.