在使用WinAPI时,经常使用的类型是wchar_t,但是我无意中找到了许多来源,它们说wchar_t不应该在其他平台上使用,因为它不是标准化的(在某些平台上是UTF-16,在其他平台上是UTF-32,等等). 如果wchar_t没有标准化,有没有一种类型(最好是UTF-16)可以可靠地跨Windows、MacOS和Linux使用,并且也与WinAPI兼容,或者以任何其他方式确保可移植性?

推荐答案

该标准的较新版本提供char16_t,将能够存储UTF-16.然而,C标准不能保证有任何大小正好为16位的类型,因此它可能大于16位.实际上,没有人使用没有16位整数的计算机,所以您不必担心这一点.

话虽如此,UTF-16在某些编程语言(如Java和JavaScript)之外的Unix上被认为在功能上已过时.Unix系统绝大多数使用UTF-8(总是没有BOM)进行数据,这也是大多数跨平台文件和数据交换格式(包括HTML、JSON和CBOR等)使用的数据格式.C标准库does在Unix上支持wchar_t,但这几乎总是32位UTF-32值,而不是UTF-16.此外,大多数Unix API将接受字节字符串,对于文本,字节字符串通常以UTF-8编码(但通常可以包含任意的非NUL字节),并且根本没有UTF-16或UTF-32版本.

因此,不存在可以在任何地方使用的单一标准编码.UTF-8 Everywhere site has a recommendation for dealing with Windows,这意味着大多数数据以UTF-8格式存储,并直接围绕API调用进行转换.这与Rust使用的方法非常相似,也是我最推荐的处理跨平台软件的方法,除非您非常确定您需要一些不同的东西.

C++相关问答推荐

如何确保内存分配在地址附近?

带双指针的2D数组

进程已完成,退出代码为138 Clion

将数据移动到寄存器时出现分段故障

使用错误的命令执行程序

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

用C++实现余弦函数

用C语言计算文本文件中的整数个数

一旦运行长度超过2,编译器是否会优化";strnlen(mystring,32)>;2";以停止循环?

处理EPOLL_WAIT中的接收数据和连接关闭信号

为什么这个分配做得不好呢?

C:Assignment中的链表赋值从指针目标类型中丢弃‘const’限定符

Fscanf打印除退出C代码为1的程序外的所有内容

为什么我的旧式&q;函数在传递浮点数时会打印2?

如何在C中计算包含递增和递减运算符的逻辑表达式?

Ubuntu编译:C中的文件格式无法识别错误

函数指针作为函数参数 - 应该使用 const 吗?

GnuCobol 使用 double 类型的参数调用 C 函数

为什么 C 字符串并不总是等同于字符数组?

c中数组上显示的随机元素