Распечатать расширенный символ ASCII в C, Linux - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь распечатать все расширенные символы ASCII. Я нашел код на форуме:

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

int main(void) {
    wchar_t c;
    setlocale(LC_ALL, "C");

    for (c = 128; c < 256; c++) {
        wprintf(L"char nr %d: %lc\n", c, c);
    }
    printf("\n%s\n", setlocale(0, NULL));

    std::cin.get();
    std::cin.get();
return 0;
}

Этот код работает в Windows в VS 2017. enter image description here

На скриншоте вы можете увидеть результат этого кода в Windows и Linux. Я знаю, что проблема связана с кодированием, но я не знаю, как это исправить.

1 Ответ

0 голосов
/ 03 января 2019

Хорошо, все в порядке. Символы ASCII ограничены ниже 128. То, что выйдет выше, зависит от фактического набора символов.

В Linux вы отображаете подмножество набора символов ISO-8859-1 (он же Latin1), в то время как в Windows вы отображаете кодовую страницу Windows 850. Когда вы объявляете кодировку UTF8 в Linux, вы должны отображать только символы ошибки, но ваш терминал, похоже, интерпретирует некоторые байты как latin1.

Если вы хотите отобразить все символы Latin1, просто измените переменную окружения LANG:

export LANG=pl_PL.ISO-8859-1

Или, поскольку ваш язык кажется польским, ISO-8859-2, вероятно, более уместен:

export LANG=pl_PL.ISO-8859-2
...