C字符串编码Windows/Linux

Fro*_*sen 6 c c-strings

如果我获取包含7位ASCII表之外的字符的字符串的长度,我会在Windows和Linux上得到不同的结果:

Windows: strlen("ö") = 1
Linux:   strlen("ö") = 2
Run Code Online (Sandbox Code Playgroud)

在Windows机器上,字符串显然以"扩展"ascii格式编码0xF6,而在Linux机器上,它以UTF-8编码0xC3 0x96,其长度为2个字符.

题:

为什么C字符串在Windows和Linux机器上的编码方式不同?


我在与Code Review的论坛成员讨论时提出了这个问题(参见本主题).

chu*_*ica 5

为什么C字符串在Windows和Linux机器上的编码方式不同?

首先,这不是Windows/Linux(操作系统)问题,但是在Windows上存在编译器编译器,其编码类似于gcc(Linux上常见).

这是C允许的,两个编译器制造商根据他们自己的编程目标制定了不同的实现,MS使用CP-1252和Linux使用Unicode. @Danh.MS的选择早于Unicode.各种编译器制造商采用不同的解决方案并不奇怪.

5.2.1字符集
1应定义两组字符及其相关的整理顺序:写入源文件的集合(源字符集),以及在执行环境(执行字符集)中解释的集合.每个集合进一步划分为基本字符集,其内容由本子条款给出,以及一组零个或多个区域设置特定成员(不是基本字符集的成员),称为扩展字符.组合集也称为扩展字符集.执行字符集的成员值是实现定义的.C11dr§5.2.11(我的重点)

strlen("ö") = 1
strlen("ö") = 2
Run Code Online (Sandbox Code Playgroud)

"ö"根据编译器的源字符扩展字符进行编码.

我怀疑MS专注于维护他们的代码库并鼓励其他语言.Linux只是早期的Unicode到C的适配器,尽管MS是早期的Unicode影响者.

随着Unicode支持的增长,我希望这将成为未来的解决方案.