2016-01-22 3 views
0

Я пытаюсь напечатать это средний оттенок Юникод окна в C: ▒Печать окна Юникода в C

(я делаю упражнение в K & R, а затем отвлеклась на один о создании гистограммы ...). Я знаю, что мой unix-термин (Mac OSX) может отображать окно, потому что я сохранил текстовый файл с полем и использовал cat textfilewithblock, и он напечатал блок.

До сих пор я сначала попробовал:

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

int main(){ 
    wprintf(L"▒\n"); 
    return 0; 
} 

и ничего не печатается

iMac-2$ ./a.out 
iMac-2:clang vik$ 

Я сделал поиск и нашел это: unicode hello world for C?

И мне кажется, что я все еще должны установить locale (хотя среда выполнения в utf8? Я все еще пытаюсь понять, почему этот шаг необходим) Но в любом случае это работает! (После того, как немного борьбы, наконец, понимая, что собственно строка была en_US.UTF-8, а не en_US.utf8, которую я где-то читал ...)

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

int main(){ 
    setlocale (LC_ALL, "en_US.UTF-8"); 
    wprintf(L"▒\n"); 
    return 0; 
} 

Выход следующим образом:

iMac-2$ ./a.out 
▒ 
iMac-2$ 

Но когда я пытаюсь следующий код ... ввод в UTF-8 hex (который я получил отсюда: http://www.utf8-chartable.de/unicode-utf8-table.pl?start=9472&unicodeinhtml=dec), который является полем 0xe29692, вместо того, чтобы вставлять ящик сам по себе, он не работает снова.

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

int main(){ 
    setlocale (LC_ALL, "en_US.UTF-8"); 
    wchar_t box = 0xe29692; 
    wprintf(L"%lc\n", box); 
    return 0; 
} 

Мне явно не хватает чего-то, но я не могу понять, что это такое.

+0

Следует отметить, что я использую следующую команду компилятора: 'cc -std = c11' – RandomUser762

+0

может быть полезен: http://stackoverflow.com/q/12017342/2476755 – royhowie

+0

На Mac OSX вы не знаете, t нужно 'wchar.h',' wprintf' или префикс 'L', или' setlocale'. Если вы хотите напечатать поле, просто распечатайте поле: 'printf (" ▒ \ n ");' – user3386109

ответ

3

Значение юникода для кодовой точки MEDIUM SHADE не 0xe29692, это 0x2592. <E2><96><92> - это 3-байтовая кодировка для этой кодовой точки в UTF-8.

Вы можете распечатать эту вещь, либо используя широкий полукокс API:

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

int main(void) { 
    setlocale(LC_ALL, "en_US.UTF-8"); 
    wchar_t box = 0x2592; 
    wprintf(L"%lc\n", box); // or simply printf("%lc\n", box); 
    return 0; 
} 

или просто напечатав кодировку UTF-8 непосредственно:

#include <stdio.h> 

int main(void) { 
    printf("\xE2\x96\x92\n"); 
    return 0; 
} 

Или, если ваш текстовый редактор кодирует исходный файл в UTF-8:

#include <stdio.h> 

int main(void) { 
    printf("▒\n"); 
    return 0; 
} 

Но следует помнить, что это не будет работать: putchar('▒');

Также для полной поддержки юникода и еще нескольких полезных свойств я рекомендую использовать iTerm2 на MacOS.

+1

Mac 'Terminal.app' поддерживает Unicode просто отлично; вы даже можете выбрать кодировку для использования через разные профили. – nneonneo

+0

@nneonneo: Да, это правда, но он был менее полным, я использую «iTerm2» по другой причине: он позволяет больше контролировать переназначение ключей-модификаторов, которые я использую много, особенно при редактировании локально и удаленно с помощью собственного версия emacs ';-)' – chqrlie

+0

Ohhhhh Я понял это сейчас! Благодаря! Utf-8 "encoding" представляет собой строку длиной до 4 байтов, а не одно значение от 1 до 4 байтов. – RandomUser762

1

Символ коробки U + 2592, что соответствует 0xE2 0x96 0x92 в UTF-8.Эта адаптация вашей третьей программы в основном работает для меня:

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

int main(void) 
{ 
    setlocale (LC_ALL, "en_US.UTF-8"); 
    wchar_t box = 0xe29692; 
    wprintf(L"%lc\n", box); 
    wprintf(L"\n\nX\n\n"); 
    box = L'\u2592'; //0xE2 0x96 0x92 = U+2592 
    wprintf(L"%lc\n", box); 
    wprintf(L"\n\n0x%.8X\n\n", box); 
    box = 0x2592; 
    wprintf(L"%lc\n", box); 
    return 0; 
} 

Выход я получаю:

X 

▒ 


0x00002592 

▒ 

Первая операция печати не производит ничего использования; другие работают.

Тестирование на Mac OS X 10.10.5. Я собираюсь скомпилировать GCC 5.3.0 (который я скомпилировал), но я получил тот же результат с XCode 7.0.2 и clang.

Смежные вопросы