【问题标题】:How to initialize a wchar_t variable?如何初始化 wchar_t 变量?
【发布时间】:2012-10-11 08:32:04
【问题描述】:

我正在阅读这本书:C: In a Nutshell,在阅读了关于宽字符的字符集部分之后,我编写了这个程序: p>

#include <stdio.h>
#include <stddef.h>
#include <wchar.h>

int main() {
  wchar_t wc = '\x3b1';
  wprintf(L"%lc\n", wc);
  return 0;
}

然后我使用 gcc 编译它,但 gcc 给了我这个警告:

main.c:7:15: 警告:十六进制转义序列超出范围[默认启用]

而且程序没有输出字符α(其unicode为U+03B1),这正是我想要它做的。

如何更改程序以打印字符 α?

【问题讨论】:

  • wchar_t wc = L'\x03b1'; 消除了警告,尽管它仍然不打印 alpha。
  • 我真正想要的不是消除警告,而是得到正确的答案。 :-(
  • 您要打印到哪里?如果是终端,您的终端设置转换的编码是什么?

标签: c gcc unicode wchar-t


【解决方案1】:

这对我有用

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

int main(void) {
  wchar_t wc = L'\x3b1';

  setlocale(LC_ALL, "en_US.UTF-8");
  wprintf(L"%lc\n", wc);
  return 0;
}

【讨论】:

  • 可以通过LC_CTYPE改变LC_ALL(此类别适用于字符的分类和转换,也适用于多字节和宽字符)
  • 这在 Windows 上不起作用;语言环境名称不同,控制台默认不使用 UTF-8。
  • 我知道,但是他在 Ubuntu 上工作,除了条件编译,你有什么建议吗?
  • 您可以使用setlocale(LC_ALL, "") 来使用在执行环境中配置的语言环境,无论是Linux 还是Windows。
【解决方案2】:
wchar_t wc = L'\x3b1';

是将 wchar_t 变量初始化为 U+03B1 的正确方法。 L 前缀用于指定 wchar_t 文字。您的代码定义了一个 char 文字,这就是编译器发出警告的原因。

打印时看不到所需字符的事实取决于本地环境的控制台设置。

【讨论】:

  • Emmmm,如何设置我的控制台?
  • 我不知道。您没有说明您使用的是什么操作系统。另外,你没有问这个。您询问了如何初始化变量。
  • 我使用的是 Ubuntu linux,你能在你的电脑上得到正确的结果吗?我只是以为问题是初始化引起的,之前没有考虑过环境。
  • @rubenv 不,\x3b1 是相同的值,无论字节序是什么。如果真的像你说的那样,整个语言就完全没用了。
  • @DavidHeffernan:只有一个 C 标准。所有旧的都被撤回了。只有当您想谈论一个过时的版本时,您才真正需要指定您正在谈论的版本。
【解决方案3】:

试试L'\x03B1'它可能会解决你的问题。如果您有疑问,可以尝试:

'\u03b1' to initialize.

【讨论】:

  • 不需要前导零。十六进制转义序列可以包含任何正数的十六进制数字。
  • @H2CO3 如果您遇到问题,请尝试将其写入 unicode 文件,然后再读回。我试过 L'\x03B1' 和 '\u03B1' 都可以工作。
  • @H2CO3 这对你来说很不幸 :-(
猜你喜欢
  • 2019-05-17
  • 1970-01-01
  • 2019-12-07
  • 1970-01-01
  • 2020-01-12
  • 1970-01-01
  • 2022-01-13
  • 2017-03-29
  • 2021-02-24
相关资源
最近更新 更多