内部和外部编码与Unicode

时间:2011-09-21 13:50:57

标签: c++ c windows posix

由于在这个问题的评论中有几个海报传播了大量的错误信息:C++ ABI issues list

我创建了这个以澄清。

  1. C样式字符串使用的编码是什么?
  2. Linux是否使用UTF-8编码字符串?
  3. 外部编码如何与窄字符串和宽字符串使用的编码相关?

2 个答案:

答案 0 :(得分:4)

  1. 实施定义。甚至是应用程序定义;标准 并没有真正对应用程序的功能进行任何限制 他们,并期望很多行为依赖于语言环境。所有 实际定义的是string中使用的编码 文字。

  2. 在什么意义上。大多数操作系统忽略了大多数编码;你会 如果'\0'不是一个空字节,则会出现问题,但即使是EBCDIC也符合这一要求 需求。否则,根据具体情况,会有一些 可能很重要的其他字符(路径名中为'/', 例如);所有这些都使用Unicode中的前128个编码,所以 将使用UTF-8进行单字节编码。举个例子,我用过 Linux下的文件名的UTF-8和ISO 8859-1。唯一真实的 问题是显示它们:例如,如果您在ls中执行xtermlsxterm将假定文件名相同 编码为显示字体。

  3. 这主要取决于语言环境。根据区域设置,它是 完全可能的窄字符串的内部编码不 对应于用于字符串文字的。 (但它怎么可能 否则,因为必须确定字符串文字的编码 编译时,作为窄字符的内部编码 字符串取决于用于读取它的语言环境,并且可以不同 字符串到下一个。)

  4. 如果您正在Linux中开发新应用程序,我强烈要求 建议对所有内容使用Unicode,UTF-32用于宽字符 字符串,UTF-8用于窄字符串。但不要指望 前128个编码点以外的任何字符串 文字。

答案 1 :(得分:-1)

  1. 这取决于架构。大多数Unix架构使用UTF-32作为宽字符串(wchar_t)和ASCII作为(char)。请注意,ASCII只是7位编码。 Windows使用UCS-2直到Windows 2000,更高版本使用变量编码UTF-16(wchar_t)。
  2. 否。 Linux上的大多数系统调用都是编码不可知的(它们不关心编码是什么,因为它们不以任何方式解释它)。外部编码实际上是由您当前的语言环境定义的。
  3. 窄字符串和宽字符串使用的内部编码是固定的,它不会随着语言环境的变化而改变。通过更改区域设置,您将查找编码和解码进入/离开程序的数据的转换函数(假设您坚持使用标准C文本函数)。