C以UTF-8格式读取和写入无符号字符(0-255)



我正试图在windows下(需要跨平台兼容性(在控制台中读取和写入无符号字符(0-255(扩展ASCII字符(unicode(

在扩展ASCII(unicode(下,代码点255是ÿ,代码点220是Ü

现在我有下面的代码用于写作和阅读。

#include<stdio.h>
#include<locale.h>
int main() {
setlocale(LC_ALL, "");
unsigned char ch = 255;
wprintf(L"Character %d = %lcn", ch, ch);
wprintf(L"Enter a character: ");
wscanf(L"%lc", &ch);
wprintf(L"Character %d = %lcn", ch, ch);
return 0;
}

输出为:

Character 255 = ÿ
Enter a character: ÿ
Character 220 = Ü

显而易见,代码点255被适当地显示为ÿ。然而,当将ÿ作为输入时,它被读取为代码点220。因此,当打印代码点220时,它被显示为Ü

因此,写作效果良好。然而,在读取时,当ASCII字符超过127(128-255(时,读取的代码点比实际值少36。

你能帮我理解我做错了什么,以及如何解决这个问题吗。

%lc采用宽字符wchar_t,宽表示它是多字节的,但具体大小取决于实现。给它一个1字节的unsigned char将导致奇怪的行为,因为它将额外读取一两个字节。

但是,如果您使用的是1字节字符,则不需要使用wprintf或wscanf。只需使用printfscanf

而且,正如其他人所指出的;扩展ASCII";不是";Unicode";。请参阅此问题了解更多信息。

最新更新