Как я могу экранировать символы, используя трехбуквенные коды ASCII?

Я хочу что-то вроде

 string magic(char c);

так что когда я сделаю

 std::cout << magic(c);

Я получил:

  • Сам символ для печати символов ASCII;
  • 2/3-буквенный код ASCII для других символов ASCII (например, "NUL", "BEL", "LF" и т. Д.)
  • Что-нибудь разумное, когда c не является ASCII (8-й бит включен).

Что мне использовать? (Это не обязательно должна быть функция.)


person einpoklum    schedule 29.03.2014    source источник
comment
Если вы хотите, чтобы вывод был печатаемым ASCII, вам нужно, чтобы по крайней мере один печатный символ ASCII был преобразован / преобразован в два или три печатаемых символа ASCII. Если вы не хотите двусмысленности.   -  person    schedule 30.03.2014
comment
Вы хотите, чтобы это работало везде (включая компьютеры ebcdic)?   -  person pmg    schedule 30.03.2014
comment
@einpoklum: Почему бы не написать самому? Пока это только ASCII (не Unicode, EBCDIC или что-то еще более странное), количество управляющих символов невелико. Просто некоторые if-else и массив специальных имен, таких как BEL ...   -  person deviantfan    schedule 30.03.2014
comment
@delnan: Не обязательно ... Я могу отличить результаты по пробелу, по ширине поля и т. д.   -  person einpoklum    schedule 30.03.2014
comment
@pmg: Не надо сходить с ума ... :-)   -  person einpoklum    schedule 30.03.2014
comment
@deviantfan: Потому что я хочу использовать общий код библиотеки, а не писать свой собственный, если это возможно. Конечно, я могу просто написать это сам.   -  person einpoklum    schedule 30.03.2014
comment
@einpoklum: Я не думаю, что для этого есть какая-нибудь функция lib.   -  person deviantfan    schedule 30.03.2014
comment
Не могли бы вы использовать простую справочную таблицу? const char *magic[] = {"NUL", "SOH" ... "a", "b" ... "0xFE", "0xFF" };.   -  person Petr Vepřek    schedule 30.03.2014
comment
Проще всего было бы скопировать реализацию od -t a (именованный символ) из любого исходного кода (GNU coreutils, BSD, AST), имеющего авторские права, которые вам больше всего нравятся. Названия кодов ASCII можно найти на странице руководства. В GNU coreutils подходящей функцией является print_named_ascii() в src/od.c.   -  person Mark Plotnick    schedule 30.03.2014


Ответы (1)


Объединяя комментарии @Pter и @ deviantfan:

По-видимому, для этого нет общих библиотечных функций. Простая реализация будет включать в себя поисковую таблицу для низкого значения ASCII и проверку 8-го бита; еще более простая реализация будет включать поисковую таблицу для всех 256 значений.

person einpoklum    schedule 29.03.2014