【发布时间】:2014-01-16 18:41:40
【问题描述】:
实际问题 - 我正在开发一个在 2 个独立硬件平台上运行的小应用程序。
编译方法及其配置由我定义和控制。
我的应用收到一个 UTF-8/ISO-8859 文本,并且应该对字符串执行一些基本操作(复制、搜索等)。
问题是,一个编译器是 GCC (sizeof(wchar_t) == 4),另一个是 Mingw(sizeof(wchar_t) == 2)。
为了支持所有 UTF-8 的可能性,我在我的代码中考虑将 wchar_t 中的“typedef”设为 uint32_t 类型,这样会强制 Mingw 编译器位于同一行,并覆盖所有 UTF- 8 个选项。
然后我打算使用标准库(mbstowcs、wcscmp、wcscpy、ex..)提供的宽字符操作函数
问题是,是否会“强制”编译器使用更多空间,可能会对库功能产生一些不良影响(除了性能之外)(更改后 mbtowcs 甚至可以在这里工作吗?)
我尝试使用 ICU,但它是一个非常大的库,因此破坏了交易。我需要它小巧可靠。
谢谢
【问题讨论】:
-
那行不通。这不是编译器的事情,而是平台的事情。请记住,mingw 是 gcc。在 Windows 上 wchar_t 是 2 个字节。故事结局。如果您需要使用 UTF-32 数据,请使用适当大小的元素类型。然后你谈论 UTF-8。我认为你需要备份。
-
@APerson:UTF-16 也支持每个字符,但是单个
wchar_t不能代表每个代码点。 -
@A: UTF-16确实支持每一个 Unicode 字符。不过,有些字符需要代理对。您可能正在考虑 UCS-2。
-
@APerson:您正在考虑 UCS-2。 UTF-16 支持从 U+0000 到 U+10FFFF 的所有 Unicode 字符。没有其他字符。
-
@APerson:代码点 U+24B62 以 UTF-16 编码为 D852 DF62。 UCS-2 和 UTF-16 不同,UTF-16 可以表示所有 Unicode 码位。