[英]What are good methods in printing Extended ASCII characters for C?
首先,我想看看C中ASCII可打印字符的样子。
以下是我的代码:
#include <stdio.h>
int main(void)
{
for (char a = 32; a < 127; a++)
printf("a=%c\n", a);
return 0;
}
#include <stdio.h>
int main(void)
{
for (unsigned char a = 32; a < 127; a++)
printf("a=%c\n", a);
return 0;
}
上面的两个代码段可以很好地工作,告诉我有关ASCII可打印字符的信息。
接下来,我想看看C的扩展ASCII字符。
#include <stdio.h>
int main(void)
{
for (unsigned char a = 128; a < 256; a++)
printf("a=%c\n", a);
return 0;
}
然后是未知字符未知的无尽循环。
我在哪里做错了?
我以为循环会在a达到256时停止,但事实并非如此。
奇怪的字符是从哪里来的?
如何为C打印扩展ASCII字符?
您有一个无限循环,因为unsigned char
可以表示的最大值为255 1 ,并且将其递增到该点之后将导致其回零,因此条件a < 256
始终为真。 如果使用int
则程序将按预期工作:
#include <stdio.h>
int main(void)
{
for (int a = 128; a < 256; a++)
printf("a=%c\n", a);
return 0;
}
它是完全没有一个通过int
对printf的%c
,只要它的值是在由表示的范围内,2个 unsigned char
,这是。
但是,如果您在现代计算机上运行此程序,则仍然可能会出现“奇怪的字符”。 例如,当我在计算机上运行它时,得到128行
a=�
这是因为现代计算机的CLI窗口要求使用UTF-8编码的Unicode文本,而在UTF-8中,U + 007F上方的所有字符都使用一个以上的字节进行编码。 因此,终端仿真器每行接收一个它认为无效,不完整的字节序列,并为它们打印一个特殊的“替换字符”。 查看U + 0080..U + 00FF范围内实际字符的最简单方法是使用C的“宽字符”:
#include <wchar.h>
#include <locale.h>
int main(void)
{
setlocale(LC_ALL, "");
for (int a = 128; a < 256; a++)
wprintf(L"U+%04X = '%lc'\n", a, (wchar_t)a);
return 0;
}
wprintf
负责将宽字符转换为环境期望的任何文本编码。 这是不能保证工作,因为C的“宽字符”被得以确认和设计不良的地方,我实际上建议人们不要在生产代码中使用它们(而应使用专门窄弦控股UTF-8)的地步,但对于像这样的测试程序,通常可以摆脱它。 我得到这样的输出:
U+0080 = ''
U+0081 = ''
U+0082 = ''
...
U+00A0 = ' '
U+00A1 = '¡'
U+00A2 = '¢'
...
U+00FD = 'ý'
U+00FE = 'þ'
U+00FF = 'ÿ'
如果您的计算机不够现代,则可能会有所不同。 U + 0080..U + 009F范围是更多无用的控制字符,这就是为什么这些字符什么都没有显示的原因。
1从技术上讲[0,255]是unsigned char
的最小要求范围; C标准允许它代表更大的范围,例如[0,511]。 如果您在unsigned char
具有该范围的计算机上运行程序,则可以正常运行。 但是,多年来没有人制造过这样的计算机。 如果您真的要担心它,请包含<limits.h>
并验证CHAR_BIT
为8和/或UCHAR_MAX
为255。
2从技术上讲,由于C的残留功能称为“默认参数提升”,因此即使提供的变量具有字符类型,也始终将int
传递给%c
。
这个
a < 256
始终为true
因为unsigned char
有效范围为<0,255>。
循环
for (unsigned char a = 128; a < 256; a++)
由于unsigned
类型的回绕 ,因此255 + 1为0,因此它将永远在您的平台上运行。 您可能会感到困惑(当您第一次看到它时)
for (unsigned char a = 128; a >= 128; a++)
打印到控制台的内容取决于系统使用的编码 ( 可能是 ASCII),以及终端如何打印该范围内的字符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.