相关疑难解决方法(0)

与GCC wchar_t有多大?

GCC支持-fshort-wchar,它将wchar_t从4切换到两个字节.

在编译时检测wchar_t大小的最佳方法是什么,所以我可以正确映射到适当的utf-16或utf-32类型?至少,直到c ++ 0x被释放并给我们稳定的utf16_t和utf_32_t typedef.

#if ?what_goes_here?
  typedef wchar_t Utf32;
  typedef unsigned short Utf16;
#else
  typedef wchar_t Utf16;
  typedef unsigned int Utf32;
#endif
Run Code Online (Sandbox Code Playgroud)

c++ macros gcc

13
推荐指数
3
解决办法
2万
查看次数

如何最好地处理 Windows 16 位 wchar_t 的丑陋问题?

我正在编写一个与 mingw 一起使用的包装层,它为应用程序提供了虚拟 UTF-8 环境。处理文件名的函数是从 UTF-8 转换并调用相应的“_w”函数的包装器,依此类推。我遇到的最大问题是 Windowswchar_t是 16 位的。

对于文件系统操作来说,这不是什么大问题。我可以在 UTF-8 和 UTF-16 之间来回转换,一切都会正常。但标准 C 多字节/宽字符转换 API 不允许多 wchar_t 字符。

可能的解决方案:

  1. 提供 CESU-8 环境而不是 UTF-8。我真的不喜欢这个。
  2. 走捷径,只支持BMP。将长度为 4 的 UTF-8 序列视为无效。
  3. 扩展包装器以替换 mingw 的包装器wchar_t并typedef int32_t wchar_t;处理WCHAR和wchar_t不同。这很痛苦,但对于需要干净的 POSIX 类型环境且不用于wchar_t任何 Windows API 目的的移植应用程序来说,它可能是理想的选择。
  4. 以下黑客:

mbrtowcwchar_t读取 4 字节 UTF-8 字符的前 3 个字节后,输出对应于高代理项的值,并将剩余状态保留在mbstate_t对象中。收到下一个字节后,它将其与保存的状态组合以输出低代理。如果最后一个字节最终无效,它将返回 -1(使用 EILSEQ)并且一个单独的代理最终会出现在输出流中(坏...)。

wcrtomb当处理高位代理时,输出 UTF-8 的前 2 个字节,并将剩余状态保存在其mbstate_t对象中。当它随后处理低位代理时,它将其与保存的状态结合起来以输出 UTF-8 的最后 2 个字节。如果未收到有效的低代理项,它将返回 -1(使用 …

c windows mingw utf-8 utf-16

5
推荐指数
1
解决办法
2075
查看次数

标签 统计

c ×1

c++ ×1

gcc ×1

macros ×1

mingw ×1

utf-16 ×1

utf-8 ×1

windows ×1