Can';t将宽字符分配到宽字符字段。

Can';t将宽字符分配到宽字符字段。,c,widechar,C,Widechar,我得到了这个学校项目。我必须按照捷克的规则按字母顺序排列物品清单。在我深入挖掘之前,我决定在16×16矩阵上测试它,所以我做了以下工作: typedef struct { wint_t **field; }LIST; ... setlocale(LC_CTYPE,NULL); .... list->field=(wint_t **)malloc(16*sizeof(wint_t *)); for(int i=0;i<16;i++) list->field[i

我得到了这个学校项目。我必须按照捷克的规则按字母顺序排列物品清单。在我深入挖掘之前,我决定在16×16矩阵上测试它,所以我做了以下工作:

typedef struct {    
wint_t **field;
}LIST;

...

setlocale(LC_CTYPE,NULL);

....

list->field=(wint_t **)malloc(16*sizeof(wint_t *));
for(int i=0;i<16;i++)  
list->field[i]=(wint_t *)malloc(16*sizeof(wint_t));
一切都很好。打印字符。但是当我试着把它改成

sorted->field[15][15] = L'Č';
它说:宽字符常量中的无关字符被忽略。(Xcode)并跳过打印部分。主.c文件是UTF-8格式的。如果我尝试打印此文件:

printf("ěščřžýááíé\n");

它把它打印出来。我不确定我是否应该使用wint\u t或wchar\u t分配mem,或者我是否做得对。我用这两种方法进行了测试,但都不起作用。

clang似乎支持使用
\x
符号将任意字节序列输入到宽字符串中:

wchar_t c = L'\x2126';
本文件未经通知即汇编

编辑:调整我在上找到的内容,以下内容对我有用:

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

int main(void)
{
    setlocale(LC_ALL,"");
    wchar_t myChar1 = L'\x2126';
    wchar_t myChar2 = 0x2126;  // hexadecimal encoding of char Ω using UTF-16
    wprintf(L"This is char: %lc \n",myChar1);
    wprintf(L"This is char: %lc \n",myChar2);
}
#包括
#包括
#包括
#包括
内部主(空)
{
setlocale(LC_ALL,“”);
wchar_t myChar1=L'\x2126';
wchar_t myChar2=0x2126;//使用UTF-16对字符Ω进行十六进制编码
wprintf(L“这是字符:%lc\n”,myChar1);
wprintf(L“这是字符:%lc\n”,myChar2);
}

并打印出漂亮的
我的终端中的字符。确保您的终端能够解释utf-8字符。

重复-重要的是,clang还不支持这种行为。如果你真的需要,试试GCC
printf()
之所以有效,是因为编译器不必关心字符串中的字节。当你的终端看到这个序列时,它会做正确的事情。@CarlNorum好吧,我只是用gcc和更简单的代码尝试了一下,它没有打印任何东西。所以,如果我理解正确的话,Xcode(在Lion上)使用了叮当声。对GCC的支持随着Lion更新而取消。但问题是,如果我尝试使用terminal和GCC()编译它。它不打印任何东西。即使我使用了\x2118。@rojcyk可能这只是错误的字符,请查看我的编辑。谢谢,我想我现在明白了:)
#include <stdio.h>
#include <wchar.h>
#include <stdlib.h>
#include <locale.h>

int main(void)
{
    setlocale(LC_ALL,"");
    wchar_t myChar1 = L'\x2126';
    wchar_t myChar2 = 0x2126;  // hexadecimal encoding of char Ω using UTF-16
    wprintf(L"This is char: %lc \n",myChar1);
    wprintf(L"This is char: %lc \n",myChar2);
}