如何初始化 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 变量?的主要内容,如果未能解决你的问题,请参考以下文章