如何初始化 wchar_t 变量?

Posted

技术标签:

【中文标题】如何初始化 wchar_t 变量?【英文标题】:How to initialize a wchar_t variable? 【发布时间】: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。 我真正想要的不是消除警告,而是得到正确的答案。 :-( 您要打印到哪里?如果是终端,您的终端设置转换的编码是什么? 【参考方案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 这对你来说很不幸 :-(

以上是关于如何初始化 wchar_t 变量?的主要内容,如果未能解决你的问题,请参考以下文章

使用字符串初始化 wchar_t[]

哪种方法对初始化 wchar_t 字符串是正确的?

Python 3.3 C 字符串处理(wchar_t 与 char)

如何在 C 中将 wchar_t 转换为 BYTE*

如何将char*转换为wchar

在 C++ 中获取 `wchar_t*` 的长度