问题描述
我正在尝试在Windows中的Windows中(需要跨平台兼容性)在控制台中读写无符号字符(0-255)的扩展ASCII字符(unicode)()。
在扩展ASCII(统一码)下,代码点255为ÿ
,代码点220为Ü
。
#include<stdio.h>
#include<locale.h>
int main() {
setlocale(LC_ALL,"");
unsigned char ch = 255;
wprintf(L"Character %d = %lc\n",ch,ch);
wprintf(L"Enter a character: ");
wscanf(L"%lc",&ch);
wprintf(L"Character %d = %lc\n",ch);
return 0;
}
输出为:
Character 255 = ÿ
Enter a character: ÿ
Character 220 = Ü
很明显,代码点255正确显示为ÿ
。
但是,当以ÿ
作为输入时,它将被读取为代码点220。
因此,在打印代码点220时,它显示为Ü
。
因此,编写工作正常。但是,在读取时,当ASCII字符大于127(128-255)时,读取的代码点比实际值小36。
请帮助我了解我在做什么错以及如何解决此问题。
解决方法
%lc
占一个wide character wchar_t
,宽表示它是多字节,但是确切的大小是特定于实现的。给它一个1字节的unsigned char
会导致奇怪的行为,因为它会再读取一个或两个字节。
但是,如果您使用的是1个字节的字符,则无需使用wprintf或wscanf。只需使用printf
和scanf
。
并且,正如其他人所述,“扩展ASCII”不是“ Unicode”。 See this question for more。