C 语言环境被定义为使用 ASCII 字符集,而 POSIX 不提供在不更改语言环境的情况下使用字符集的方法。
如果将 C 的编码切换为 UTF-8 会发生什么?
积极的一面是 UTF-8 将成为任何进程(甚至系统守护进程)的默认字符集。显然,有些应用程序会崩溃,因为它们假设 C 使用 7 位 ASCII。但这些应用程序真的存在吗?现在很多编写的代码在一定程度上都是区域设置和字符集感知的,我会惊讶地看到代码可以仅有的处理 7 位干净输入,并且不能轻易适应接受支持 UTF-8 的 C。
答案1
C 语言环境不是默认语言环境。这是一个保证不会引起任何“令人惊讶”行为的区域。许多命令在或语言环境中具有保证形式(例如ps
或df
标头、date
格式)的输出。对于编码 ( ),保证只包含 ASCII 字母,依此类推。如果修改了区域设置,许多应用程序就会出现异常行为。例如,它们可能会拒绝无效 UTF-8 的输入,而不是将其视为二进制数据。C
POSIX
LC_CTYPE
[:alpha:]
C
如果您希望系统上的所有程序都使用 UTF-8,请将默认区域设置设置为 UTF-8。也就是说,所有操作单一编码的程序。有些程序只操作字节流而不关心编码。某些程序操作多种编码并且不关心区域设置(例如,Web 服务器或 Web 客户端设置或读取标头中每个连接的编码)。
答案2
我想你有点困惑。 “C 语言环境”与任何其他语言环境一样,正如您所指出的,它通常是 7 位 ASCII 的同义词。
我想它是内置于 C 库中的,因此该库有某种后备功能——不可能没有语言环境。
然而,这与 C 代码构建的程序如何处理输入没有任何关系。区域设置用于翻译传递的输入到一个可执行文件,如果系统区域设置是 UTF-8,则无论其源代码是用 C 还是其他语言编写,程序都会获取 UTF-8。所以:
我会很惊讶地看到代码只能处理 7 位干净输入并且不能轻松地适应接受支持 UTF-8 的 C
确实没有意义。从标准输入读取的最小标准 C 源代码接收来自系统的字节流。如果系统使用 UTF-8 并且从某些 HID 硬件生成流,则该流可能包含 UTF-8 编码字符。如果它来自其他地方(例如网络、文件),它可能包含任何内容,这就是使假设UTF-8 标准很有用。
事实上,C 语言环境是比 UTF-8 语言环境受限制得多的字符集,这一事实与之无关。它只是被称为“C 语言环境”,但实际上它与编写 C 代码的关系并不比任何其他语言更多或更少。
事实上,您可以将 UTF-8 字符硬编码到源代码中的 C 字符串中。假设系统是 UTF-8,这些字符串在被生成的可执行文件使用时看起来是正确的。
我相信您在评论中发布的“Roger Leigh”链接指的是使用扩展集(UTF-8)作为用于嵌入式环境的 C 库中的 C 语言环境,因此无需加载其他语言环境系统处理UTF-8。
那么问题的答案是:“如果 C 语言环境是 UTF-8 而不是 ASCII,会出现什么问题?”是,我会猜测,没什么,但是在嵌入式环境之外等等,没有太多必要这样做。但很可能在某个时候它会成为 GNU C 等库的规范(我认为也可能如此)。