这引起了我的兴趣,所以我要问一下 - 为什么wchar_t
在Linux /类似Linux的系统上没有像在Windows上那样广泛使用?具体来说,Windows API在内部使用wchar_t
,而我认为Linux没有,这反映在许多使用char
类型的开源软件包中。
我的理解是,如果一个字符c
需要多个字节来表示它,那么char[]
形式c
会分成char*
的几个部分,而它在wchar_t[]
中形成一个单元。那么,总是使用wchar_t
并不容易吗?我是否错过了否定这种差异的技术原因?或者它只是一个收养问题?
答案 0 :(得分:17)
wchar_t
是一个宽字符,具有平台定义的宽度,这实际上没有多大帮助。
UTF-8字符每个字符跨越1-4个字节。 UCS-2,每个字符只有2个字节,现在已经过时,不能代表完整的Unicode字符集。
支持Unicode的Linux应用程序倾向于在字节方式存储层之上正确地执行此操作。 Windows应用程序倾向于做出这个愚蠢的假设,即只有两个字节可以做。
wchar_t
's Wikipedia article简要介绍了这一点。
答案 1 :(得分:9)
第一批在基于Unix的平台上使用UTF-8的人explained:
Unicode标准[版本1.1] 定义一个 足够的字符集但是 不合理的陈述[UCS-2]。它指出 所有字符都是16位宽[不再是真的] 并以16位为单位进行通信和存储。 它还预留了一对 字符(十六进制FFFE和 FEFF)检测字节顺序 传输文本,要求国家 字节流。 (Unicode 联盟正在考虑文件,而不是 管道。)采用这种编码,我们 将不得不转换所有文本 进出9号计划之间 ASCII和Unicode,不可以 完成。在一个程序中,在 命令其所有输入和输出, 可以将字符定义为 16位数量; 在一个上下文中 网络系统有数百个 在各种机器上的应用 不同的制造商 [italics mine],它是 不可能的。
斜体部分与Windows系统不太相关,Windows系统偏向于单片应用程序(Microsoft Office),非多样化计算机(一切都是x86,因此是小端),以及单个操作系统供应商。
拥有小型单一目的程序的Unix理念意味着他们需要进行严格的角色操作。
我们工具的来源和 应用程序已经存在 转换为使用Latin-1,所以它 是'8位安全',但转换 到Unicode标准和UTF [-8]是 更多地参与。有些程序不需要 完全改变:例如
cat
解释其参数字符串, 以UTF [-8]格式发送,作为文件名 它没有被解释到open
系统调用,然后只是复制 从输入到输出的字节数;它 永远不会根据。做出决定 字节值...大多数程序, 但是,需要适度的改变。......实际上很少有工具需要操作 在符文[Unicode代码点] 内部;更典型的是他们需要 只是为了寻找最后的斜线 文件名和类似的琐碎任务。 在170个C源程序中......只有23个 现在包含单词
Rune
。存储符文的程序 内部大多是那些人 raison d'être是性格 操纵:山姆(文本编辑器),
sed
,sort
,tr
,troff
,8½
(窗口 系统和终端仿真器)等 上。决定是否使用计算 符文或UTF编码的字节串 需要平衡成本 读取时转换数据 写下转换成本 相关文字。对于程序 比如运行很长时间的编辑 具有相对恒定的数据集, 符文是更好的选择...
如果您需要类别和案例映射等字符属性,UTF-32(可直接访问代码点)确实更方便。
但是宽泛的人在Linux上使用起来很尴尬,原因与UTF-8在Windows上使用起来很不一样。 GNU libc没有_wfopen
或_wstat
函数。
答案 2 :(得分:4)
与ASCII兼容的UTF-8可以在某种程度上忽略Unicode。
通常,程序不关心(事实上,不需要关心)输入是什么,只要没有\ 0可以终止字符串。参见:
char buf[whatever];
printf("Your favorite pizza topping is which?\n");
fgets(buf, sizeof(buf), stdin); /* Jalapeños */
printf("%s it shall be.\n", buf);
我发现需要Unicode支持的唯一时间是我必须将多字节字符作为单个单元(wchar_t);例如当必须计算字符串中的字符数而不是字节数时。从utf-8到wchar_t的iconv很快就会做到这一点。对于像零宽度空间和组合变音符号这样的更大问题,需要像icu这样更重的东西 - 但是你多久会这样做呢?
答案 3 :(得分:1)
wchar_t
在所有平台上的大小不同。在Windows上,它是一个使用两个字节的UTF-16代码单元。在其他平台上,它通常使用4个字节(对于UCS-4 / UTF-32)。因此,这些平台不太可能使用wchar_t
标准化,因为它会浪费大量空间。