繁体   English   中英

为C打印扩展ASCII字符有什么好的方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM