gpt4 book ai didi

c - putwchar() 无法显示 wchar_t 变量

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:14 26 4
gpt4 key购买 nike

为什么 printf() 可以显示 é (\u00E9 int UTF-16) 而 putwchar() 不能?

让 putwchar 正确显示 é 的正确语法是什么?

#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
wint_t wc = L'\u00E9';

setlocale(LC_CTYPE, "fr_FR.utf8");

printf("%C\n", wc);
putwchar((wchar_t)wc);
putchar('\n');

return 0;
}

环境

  • 操作系统:openSUSE Leap 42.1
  • 编译器:gcc 版本 4.8.5 (SUSE Linux)
  • 终端:终结者
  • 终端编码:UTF-8
  • 外壳:zsh
  • CPU:x86_64

外壳环境:

env | grep LC && env | grep LANG
LC_CTYPE=fr_FR.utf8
LANG=fr_FR.UTF-8
GDM_LANG=fr_FR.utf8

编辑

在:

wint_t  wc = L'\u00E9'
setlocale(LC_CTYPE, "");

输出:

C3 A9 0A E9 0A

在:

wint_t wc = L'\xc3a9';               
setlocale(LC_CTYPE, "");

输出:

EC 8E A9 0A A9 0A

最佳答案

您不能在同一个流中混合使用宽字符和字节输入/输出函数(printf 是一个字节输出函数,无论它是否包含宽字符格式)。流的方向只能用 freopen 重置,必须在调用面向字节的 putchar 函数之前再次完成。

#include <stdlib.h>
#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
wint_t wc = L'\u00E9';

setlocale(LC_CTYPE, "");

printf("%lc\n", wc);
freopen(NULL, "w", stdout);
putwchar((wchar_t)wc);
freopen(NULL, "w", stdout);
putchar('\n');

return 0;
}

方向只能通过重新打开流来设置这一事实表明这不是为了简单地完成,大多数程序应该只使用一种输出。 (即 wprintf/putwchar 或 printf/putchar,如果需要打印宽字符,则使用 printf 或 wctomb)

关于c - putwchar() 无法显示 wchar_t 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com