为什么wchar_t在Linux /相关平台的代码中没有被广泛使用?

时间:2011-01-03 20:57:57

标签: c unicode wchar-t

这引起了我的兴趣,所以我要问一下 - 为什么wchar_t在Linux /类似Linux的系统上没有像在Windows上那样广泛使用?具体来说,Windows API在内部使用wchar_t,而我认为Linux没有,这反映在许多使用char类型的开源软件包中。

我的理解是,如果一个字符c需要多个字节来表示它,那么char[]形式c会分成char*的几个部分,而它在wchar_t[]中形成一个单元。那么,总是使用wchar_t并不容易吗?我是否错过了否定这种差异的技术原因?或者它只是一个收养问题?

4 个答案:

答案 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是性格   操纵:山姆(文本编辑器),   sedsorttrtroff(窗口   系统和终端仿真器)等   上。决定是否使用计算   符文或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标准化,因为它会浪费大量空间。