Как напечатать расширенные символы ASCII от 127 до 160 через программу C?

Я пытаюсь в приведенном ниже коде напечатать все символы ASCII, но он ничего не печатает от 127 до 160. Я знаю, что это набор управляющих символов или некоторые латинские/испанские символы. Если те же символы копируются из Windows, они хорошо печатаются в Unix. Почему бы не через программу C?

#include <stdio.h>

int main()
{
    int i;
    char ch;

    for(i = 0; i < 256; i++)
    {
        printf("\n%03d %02x %02c",i ,i ,i);
    }
}

person CodeCodeCode    schedule 03.05.2013    source источник
comment
Измените кодировку терминала с utf8 на iso-8859-15 и посмотрите, что произойдет.   -  person David Ranieri    schedule 03.05.2013
comment
таблица ascii идет от 0 до 127, от 128 до 255 - это расширенные коды, поэтому я думаю, что printf поддерживает только коды ascii по умолчанию.   -  person amalrik maia    schedule 03.05.2013
comment
@DavidRF Как изменить кодировку в терминале? Я использую Пути.   -  person CodeCodeCode    schedule 03.05.2013
comment
взгляните на этот поток   -  person amalrik maia    schedule 03.05.2013


Ответы (2)


ASCII — это 7-битный код. Интерпретация значений байтов выше 128 зависит от ОС, ваших региональных/языковых настроек и т. д. Они не стандартные. В Windows на английском языке они чаще всего определяются CP1252; в Linux чаще используется ISO-8859-1. Некоторые ОС используют кодировку UTF-8, которая сама по себе не является набором символов, а представляет собой способ кодирования Unicode в 8-битный поток с использованием более одного байта для большинства символов. Если вам действительно нужно работать с символами за пределами стандарта ASCII 32-126, вам действительно следует использовать широкие символы и локали.

Кстати, символ 127 — это особый случай: это управляющий символ «рубаут», обозначающий стертые данные. (Это было сделано для того, чтобы кусок бумажной ленты можно было стереть, пробив все отверстия! -- да, некоторые из нас достаточно взрослые, чтобы помнить бумажную ленту).

person Lee Daniel Crocker    schedule 03.05.2013
comment
@ Ли +1 за то, что помнишь бумажную ленту в эпоху чипов памяти. - person CodeCodeCode; 03.05.2013

Возможно, вы захотите изучить setlocale. Я не знаю, какой набор символов вы ищете, но вы можете попробовать setlocale (LC_ALL,"");, чтобы настроить печатные символы в соответствии с окружающей средой (что, похоже, соответствует вашим требованиям, поскольку сработало копирование и вставка).

person Pieter Gijsbers    schedule 03.05.2013