C программирование, Unicode и терминал Linux - PullRequest
3 голосов
/ 09 февраля 2010

Итак, я пытаюсь написать японские символы в моем терминале. экран с использованием Си и широких символов.

Вопрос в том, что не так с тем, что я делаю, чтобы я мог это исправить, какие еще предостережения следует ожидать при использовании широких символов и у вас есть другие комментарии о том, что я пытаюсь сделать?




Плохой код:

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

int main( ) {
    wprintf(L"%c\n", L"\x3074");
}

Это не работает, но я хочу знать почему.


проблема только усугубляется, когда я пытаюсь использовать wchar_t для хранения значения:

wchar_t pi_0 = 0x3074;      // prints a "t" when used with wprintf
wchar_t pi_1 = "\x3074";    // gives compile time warning
wchar_t pi_2 = L"\x3074";   // gives compile time warning

Так что я бы тоже хотел сделать эту работу, так как планирую иметь структуры данных удерживая строки этих символов.




Спасибо!

Ответы [ 2 ]

10 голосов
/ 09 февраля 2010

Тип "\x3074" равен const char[], а тип L"\x3074" равен const wchar_t[].

Если вам нужно wchar_t, используйте одинарные кавычки:

L'\x3074'

Также %c печатает char, но для wchar_t вам нужен %lc.

4 голосов
/ 09 февраля 2010

В коде есть как минимум две проблемы.

  • Кенни указал первый, формат не соответствует аргументу
  • во-вторых, вы пропускаете вызов setlocale ()

(Существует также предположение, что широким набором символов является Unicode - кажется, я помню, что это всегда так для Linux, но это не универсально).

В правильно настроенном терминале,

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

int main( ) {
    setlocale(LC_ALL, "");
    wprintf(L"%ls\n", L"\x0152\x3074");
    return 0;
}

должно работать. Если этого не произойдет, я начну с проверки результатов setlocale () и wprint ().

(я добавил U + 0152, который является лигатурой OE, чтобы я мог проверить поведение; я не использую шрифт с U + 3074)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...