您的编译器和终端很可能都使用UTF-8对非ASCII字符进行编码.
字符集和编码是一个庞大的主题,有许多不同和不兼容的约定和实现.在诸如ISO8859-1
和Windows-1252
的传统单字节编码上,Â
实际上被编码为194.它也是UNICODE标准中的字符数字,它有Â
000多个不同的代码点,代表世界上几乎每一种语言和符号集.
有不同的方法将这些字符表示为字节序列,其中最普遍的是UTF-8,在99%的网页中使用.32-127范围内的ASCII字符表示为单字节,码点较大的字符使用2-4字节之间的字符,C2
-F4
范围内的前导字节和80
-BF
范围内的1-3个尾随字节.Â
被编码为C3 82
,这意味着"Â"
实际上是与"\xC3\x82"
相同的2字节字符串.
您可以使用以下代码验证这一点:
#include <stdio.h>
#include <string.h>
int main(void) {
const char *s = "Â";
int len = strlen(s);
printf("%s: len=%d, bytes=", s, len);
for (int i = 0; i < len; i++) {
printf("%02hhX%c", s[i], " \n"[i == len - 1]);
}
return 0;
}
输出应为Â: len=2, bytes=C3 82
.
要在输出流上将非ASCII字符转换为UTF-8序列,您可以使用<locale.h>
和宽字符输出中的区域设置函数:
setlocale(LC_ALL, "en_US.UTF-8");
printf("%lc\n", 194);
输出:
Â
如果在终端中正确配置了区域设置,则可以 Select 默认区域设置setlocale(LC_ALL, "");