C编程语言中的字符编码依赖于什么?

时间:2017-11-04 17:29:03

标签: c gcc character-encoding

C编程语言中的字符编码依赖于什么? (OS?编译器?还是编辑器?) 我不仅处理ASCII字符,还处理其他编码,如UTF-8。

我们如何检查C中的当前字符编码?

2 个答案:

答案 0 :(得分:0)

平台或依赖于显示设备/框架。当这些值在某些显示设备上呈现为字形时,编译器不关心平台如何解释charwchar_t

如果输出是某个远程终端,则渲染将依赖于终端而不是执行环境,而在台式计算机中,渲染可能是文本控制台或GUI,以及生成的渲染甚至可能在这些之间有所不同。

答案 1 :(得分:0)

C源代码可能存储在不同的编码中。这显然是编译器依赖(即编译器设置,如果可用)。虽然,我不会指望它,并始终依靠ASCII。 (恕我直言,这是编写代码的最便携方式。)

实际上,如果使用八进制或十六进制序列对它们进行编码,则可以仅使用C源代码中的ASCII编码任何编码的任何字符。 (这是我不时为了赢得同事的尊重而做的事情 - 将\303\244\303\266\303\274\303\231的德语文本写入翻译表格中...)

示例:"\303\274"为字符串常量“ü”编码UTF-8序列。 (但是如果我在我的Windows控制台上打印它,我只会得到“ ”,虽然我设置了代码页65001,它应该提供UTF-8。该死的Windows控制台......)

用C编写的程序可以处理您能够处理的任何编码。实际上,字符只是可以存储为可用整数类型之一的数字(例如,对于ASCII和UTF-8,char,对于具有16或32位宽字符的编码,其他int类型。正如Clifford已经提到的,输出决定如何处理这些数字。因此,这是 platform 依赖。

要根据特定编码处理字符(例如,将其设置为大写或小写,类似于本地字典的排序等),您必须使用适当的库。这可能是标准库,系统库或第三方库的一部分。

从一种编码转换为另一种编码尤其如此。这是提及libintl的好点。

我个人更喜欢ASCII,Unicode和UTF-8(不幸的是UTF-16,因为我在Windows 10上做的大部分工作)。在这种特殊情况下,转换可以通过纯粹的“bit-fiddling”算法完成(不需要任何特殊字符的知识)。您可以查看Wikipedia UTF-8以获取线索。通过谷歌,你可能会发现一些可以随时使用的东西,如果你不想自己做的话。

C ++ 11和C ++ 14的标准库也提供了支持(例如std::codecvt_utf8),但它在C ++ 17中被弃用了。因此,我不需要丢掉我的小巧代码(我很自豪)。糟糕。这标有 - 抱歉。