【问题标题】:Can't assign wide char into wide char field.无法将宽字符分配给宽字符字段。
【发布时间】:2012-01-17 01:14:21
【问题描述】:

我得到了这个学校项目。我必须按捷克规则按字母顺序对项目列表进行排序。在深入挖掘之前,我决定在 16 x 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'C';
wprintf(L"%c\n",sorted->field[15][15]);

一切都很好。打印字符。但是当我尝试将其更改为

sorted->field[15][15] = L'Č';

它说:宽字符常量中的无关字符被忽略。 (Xcode) 并跳过打印部分。 main.c 文件采用 UTF-8 格式。如果我尝试打印:

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

它按照书面形式打印出来。我不确定是否应该使用 wint_t 或 wchar_t 分配内存,或者我是否做得对。我用这两种方法都测试过,但都不起作用。

【问题讨论】:

标签: c widechar


【解决方案1】:

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

wchar_t c = L'\x2126';

编译,恕不另行通知。

编辑:改编我在wikipedia about wide characters 上找到的内容,以下内容对我有用:

#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);
}

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

【讨论】:

  • 所以如果我理解正确,Xcode(在 Lion 上)使用 clang。 Lion 更新取消了对 GCC 的支持。但问题是,如果我尝试使用终端和 GCC (pastebin.com/SZmTekYW) 编译它。它不打印任何东西。即使我使用 \x2118.
  • @rojcyk 也许这只是错误的字符,请查看我的编辑。
  • 谢谢,我想我现在明白了:)
猜你喜欢
  • 2013-02-18
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多