【问题标题】:wide char string functions on linux / windowslinux / windows上的宽字符字符串函数
【发布时间】:2015-07-10 08:06:30
【问题描述】:

我想创建一个字符串库,其中包含两个不同的字符串类来处理 UTF-8 和 UCS-2(我相信这是某种 UTF-16,不处理 0xFFFF 以上的代理和字符)。

在 Windows 平台上,宽字符为 2 个八位字节宽。在 Linux 上它们是 4。那么与宽字符字符串相关的函数会发生什么?您是否在 Windows 上传递 2 个八位字节宽的项目和在 linux 上传递 4 个八位位组宽的项目的缓冲区?如果是,那么它会使这些功能在 windows 和 linux 上完全不同,这并不能使它们真正“标准”...

在尝试创建一个应该以与跨平台代码相同的方式操作宽字符的库时,如何处理这个问题?谢谢。

【问题讨论】:

  • glib 具有适用于 UTF-8 的字符串实用函数,这可能会有所帮助。
  • 我假设我可以在 linux 和 windows 上使用窄字符字符串函数,因为它们都使用一个字节字符。我的问题是关于使用宽字符。
  • 您提议重新发明轮子。此类事物有多种现有的库,具有不同级别的功能。其中一个更好的是 IBM 赞助的开源多平台 ICU 项目。

标签: c linux windows string unicode


【解决方案1】:

您说得对,wchar_t 在 Windows 和 Linux 上的大小不同。这也意味着您对宽字符处理功能不太有用是正确的。您可能应该查看一个编码转换库,例如libiconv。然后,您可以在内部使用 UTF-8 并在 I/O 上进行转换。

【讨论】:

  • 谢谢,但出于性能原因,我想使用一种允许直接访问像 UCS-2 这样的第 N 个字符的编码,这就是为什么我正在寻找一种使用宽字符的方法在windows linux上也是这样。也许我可以包装 windows 宽字符串函数以从 UTF-32 转换为 UCS-2 等反向,或者使用 linux 函数做相反的事情。
  • 嗯,你也可以使用 iconv 转换为 UCS-2。
  • @Virus721,那么我希望您正在规范化字符串以使用组合字符,例如将“e\u0300”替换为“è”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
  • 1970-01-01
  • 2015-04-02
  • 2016-11-29
  • 2014-04-11
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多