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