2013-11-13 3 views
1

В моей системе довольно обычный Ubuntu 13.10, французский символ «éèàçù ...» всегда обрабатывается любыми инструментами, которые я использую, несмотря на то, что переменные среды LC_ устанавливаются на en_US. UTF-8. В частности, утилиты командной строки, такие как grep, cat, ... всегда читают и печатают эти символы без заминки.Невозможно установить stdout в режиме широких символов

Несмотря на эти замечания, такая небольшая программа, как

int main() { 
    printf("%c", getchar()); 
    return 0; 
} 

терпит неудачу, когда пользователь вводит «E».

С man-страниц и большого количества поисковых запросов нет стандартного способа закрыть stdout, а затем повторно открыть его. Из man fwide(), если stdout находится в байтовом режиме, я не могу передать его в режим широкого символа, не закрывая его и не открывая его ... поэтому я не могу использовать getwchar() и wprintf().

Я не могу поверить, что каждая утилита, такая как cat, grep и т. Д., Повторно реализует способ управления широкими символами, но из моих исследований я не вижу другого пути.

Есть ли у моей системы проблемы? Я не вижу, как с тех пор всякая утилита работает безупречно. Что мне не хватает, пожалуйста?

+0

Вам не нужны широкие символы для поддержки Unicode. – ninjalj

+0

Если я читаю char по char, что я делаю, потому что мое приложение находится в сыром режиме, я полагаю, что знаю, но я вполне мог ошибаться. – pouzzler

ответ

3

При запуске программы C stdout, stdin и stderr не являются ни байтовыми, ни широкосимвольными. fwide(stdin, 0) должен вернуть 0 в этот момент.

Если расширить минимальную программу для:

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

int main() 
{ 
     setlocale(LC_ALL, ""); 
     printf("%lc\n", getwchar()); 
     return 0; 
} 

Затем он должен работать, как вы ожидаете. (Здесь нет необходимости явно указывать ориентацию stdin - так как первая операция на ней - широкосимвольная операция, она будет иметь широкосимвольную ориентацию).

Вы сделать необходимость использовать getwchar() вместо getchar(), если вы хотите читать широкий характер с ним, хотя.

0

Символ UTF-8 берется как байтовый код, а не символ, а символ не ascii - более одного байта. Check this Question

для получения дополнительной информации

0

утилиты вы упоминаете, как правило, линия-ориентированной. Если бы вы попытались прочитать целую строку, например. fgets(), а не один персонаж, я думаю, это сработает и для вас.

Когда вы начинаете читать отдельные символы (которые могут быть просто байтами и часто являются), вы, конечно, очень подвержены проблемам кодирования.

Чтение полных строк будет работать очень хорошо, если кодирование с терминами линии не будет неправильно понято (а для UTF-8 оно не будет).

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