我正在尝试在以下代码中打印方形标记:
代码1:
char* exp = new char[300];
*(exp) = 178// which is 2's extended ascii code
*(exp+1) = '\0'// end of string
printf("%s",exp);`
会打印“?”
似乎小2将自动加入下一个字母:
代码2:
char* exp = new char[300];
*(exp) = 178// which is 2's extended ascii code
*(exp+1) = '4'// or anything '5' 'a' '#'...
*(exp+2) = '\0'// end of string
printf("%s",exp);
它会打印一个中文单词,或者可能不是,但非常喜欢。
该怎么办?我只想打印“小2”。
PS:
在WindowsXP控制台中,非常感谢您的帮助。
答案 0 :(得分:6)
以下是打印上标2的三种不同方法:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc, char** argv)
{
setlocale(LC_CTYPE, "");
wchar_t *foo = L"²";
wprintf(L"%ls\n", foo);
wprintf(L"²\n");
wchar_t bar[2];
bar[0] = 178;
bar[1] = 0;
wprintf(L"%ls\n", bar);
return 0;
}
答案 1 :(得分:1)
178在ASCII表中不是小二,它是一个块。难道不是更喜欢253吗?
此外,数字如何转换为字符取决于您使用的平台。但你对此一无所知。
答案 2 :(得分:1)
ASCII字符集仅涵盖英文字母,数字和一堆其他字符,但没有像方形符号,钻石或俱乐部之类的东西。这些字符超出了ASCII规范,并且取决于读取输出的人将采用哪种编码。所有非英文字符(例如中文,日文,俄文,北欧口音字母,希伯来文......)都不在ASCII规范范围内。
当计算机产生一些输出时,您可以放心地假设如果您只坚持使用ASCII子集,那么您的字节将是明确的(有时候使用不同的编码很常见,即使只是英文字母,但现在这些时代大多都没了)。但是,如果输出包含任何高于127的字节,则解释取决于读者将考虑哪种编码。
非常常见的编码是例如Latin-1(ISO8859-1),其中平方符号是代码178,CP850(DOS),其中平方符号是253或UTF-8,其中平方符号是序列194+ 178。
鉴于您的终端正在显示中文字符,我猜可能它将您的输出解释为UTF-8,因为它是一个编码,每个字符使用可变数量的字节,但是它能够表示任何unicode字符; iso-8859-1和cp850都不能代表汉字。
然而,这只是猜测,因为还有其他非常常见的编码,例如日文字符......(Shift-JIS)