【发布时间】:2020-09-30 21:51:17
【问题描述】:
我正在尝试在 C 中从 Windows 下的控制台读取和写入 unsigned char (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 = %lc\n", ch, ch);
wprintf(L"Enter a character: ");
wscanf(L"%lc", &ch);
wprintf(L"Character %d = %lc\n", ch, ch);
return 0;
}
输出是:
Character 255 = ÿ
Enter a character: ÿ
Character 220 = Ü
显然,代码点 255 正确显示为 ÿ。
但是,当以 ÿ 作为输入时,它被读取为代码点 220。
因此,当打印代码点 220 时,它会显示为 Ü。
因此,写作工作正常。但是,在读取时,当 ASCII 字符大于 127 (128 - 255) 时,读取的 code-point 比实际值小 36。
请您帮助我了解我做错了什么以及如何解决这个问题。
【问题讨论】:
-
扩展 ascii != utf-8
-
@para 也许我的措辞有误。我已将术语从 UTF-8 更改为 Unicode。我的意思是我需要在 unsigned char 中使用 Unicode 的前 256 个(0 - 255)个字符并从控制台读取它并打印回控制台。
-
您的控制台使用什么编码?哪个操作系统?
-
wscanf与%lc为unsigned char可能会导致未定义的行为。 -
@MarkRansom 我正在使用带有 DOS 终端的 Windows。终端编码为CP437。
标签: c unicode utf-8 ascii extended-ascii