C编程语言中的字符编码依赖于什么? (OS?编译器?还是编辑器?) 我不仅处理ASCII字符,还处理其他编码,如UTF-8。
我们如何检查C中的当前字符编码?
答案 0 :(得分:0)
平台或依赖于显示设备/框架。当这些值在某些显示设备上呈现为字形时,编译器不关心平台如何解释char
或wchar_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的标准库也提供了支持(例如糟糕。这标有c - 抱歉。std::codecvt_utf8
),但它在C ++ 17中被弃用了。因此,我不需要丢掉我的小巧代码(我很自豪)。