Невозможно назначить широкий символ в поле широкого символа. - PullRequest
0 голосов
/ 09 декабря 2011

Мне дали этот школьный проект. Я должен отсортировать по алфавиту список предметов по чешским правилам. Прежде чем копать глубже, я решил проверить это на матрице 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'C';
wprintf(L"%c\n",sorted->field[15][15]);

Все хорошо. Чар напечатан. Но когда я пытаюсь изменить его на

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

Это говорит: посторонние символы в константе широких символов игнорируются. (Xcode) И часть печати пропускается. Файл main.c находится в UTF-8. Если я попытаюсь напечатать это:

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

Он печатает это как написано. Я не уверен, стоит ли мне выделять mem с помощью wint_t или wchar_t или я делаю это правильно. Я проверил это с обоими, но ни один из них не работает.

1 Ответ

0 голосов
/ 10 декабря 2011

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

и печатает хорошие символы в моем терминале.Убедитесь, что ваш терминал способен интерпретировать символы utf-8.

...