簡體   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