Как распечатать символы ascii от 0 до 255 в C, отображаемые на веб-странице через Django? - PullRequest
2 голосов
/ 23 сентября 2011

Я работаю над заданием C для школы.Вот точная формулировка назначения:

"Напишите программу, которая печатает список целых чисел от 0 до 255 и соответствующий символ ASCII."

Фактический код был достаточно прост:

#include <stdio.h>

int main() {
    int i;

    for (i = 0; i <= 256; i++) {
        printf("%d --> %c\n", i, i);
    }
    return 0;
}

Однако мне нужно отобразить этот вывод на веб-странице с Django.Я скомпилировал этот код с помощью gcc (с включенной опцией -std = C99), и он отлично работает.Однако на веб-странице это ничего не выводит.Наше представление Django использует popen2, чтобы открыть исполняемый файл с этим кодом:

if os.path.isfile(file_sh):
    output = popen2.popen2(file_sh)[0].read()

, и страница была протестирована для работы со всем другим кодом C для этого класса.Я добавил в представление оператор печати, чтобы убедиться, что вывод кода правильно отправляется в браузер, и он корректно отображается в терминале, но не в браузере.На самом деле, он вообще не отображается в браузере.При дальнейшей проверке, внутри тега нет абсолютно ничего, что обычно отображало бы вывод кода.Я предполагаю, что это как-то связано с кодировкой символов.Любые идеи?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что в моем шаблоне я указал метадание для кодировки символов utf-8.

РЕДАКТИРОВАТЬ 2: Мой друг имеетверсия, которая отображает содержимое текстового файла, сохраненного в Windows как utf-8 на http://geekingreen.dyndns.org/week02/Assignment-5,, но если он пытается отобразить эту страницу с выводом из исполняемого файла, он получает ту же проблему, что и я.

Ответы [ 5 ]

1 голос
/ 23 сентября 2011

Ха, нашел способ, по крайней мере, отобразить его на странице, символы отображаются неправильно, но, по крайней мере, что-то отображает страницу.

Код просто такой:

mystring = unicode(mystring, errors='replace')

РЕДАКТИРОВАТЬ: нашел еще лучший способ

import chardet
chartype = chardet.detect(mystring)

# perhaps you may want to check the confidence that it is that encoding first?
# if chartype['confidence'] > 0.5 or something

mystring = mystring.decode(chartype['encoding']).encode('utf-8')

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

0 голосов
/ 23 сентября 2011

Подсказка: подумайте об этом ÿ (& # 254;), ÿ (& # 255;) или μ (& # 956;).Просто удалите пробелы, чтобы получить символы.

Вы можете сделать довольно простой подсчет:

for i in range(256):
    print '&#%s;<br/>\n' % i
0 голосов
/ 23 сентября 2011

Как уже пытались сказать другие, вам просто нужно использовать правильную кодировку.

output = popen2.popen2(file_sh)[0].read().decode('cp1252')
0 голосов
/ 23 сентября 2011

Скорее всего, кодировка символов не является проблемой. Хотя Django использует исключительно строки Unicode, а Python по умолчанию использует строки ASCII, набор символов UTF-8 обратно совместим с ASCII.

Скорее всего, вы случайно не включили переменную в страницу вообще. Если ваша функция выглядит так:

def view_function(request):
    output = ''
    if os.path.isfile(file_sh):
        proc = subprocess.Popen(file_sh, stdout=subprocess.PIPE)
        stdout, stderr = proc.communicate()
        output = stdout
    return render_to_response('template.html', {'output': output})

и ваш шаблон выглядит так:

<!DOCTYPE html>
<html>
    <head>...</head>
    <body>
    <p>
        {{ output }}
    </p>
    </body>
</html>

тогда вы должны увидеть символы на странице. Текст не будет разбиваться на те же строки, что и вывод терминала, но, по крайней мере, вы увидите что-то. С другой стороны, если вы измените тег включения на {{ouptut}}, неправильное написание не приведет к тому, что на странице ничего не будет встроено.

Просто убедитесь, что у вас не отключено автоэкранирование - если вы это сделаете, строка "->" будет выглядеть как конец комментария и нарушит структуру HTML страницы.

Еще одно предложение: используйте подпроцесс вместо popen2. Документы Python помечают popen2 как устаревший.

0 голосов
/ 23 сентября 2011

необработанные байты со значениями 128..255 не являются допустимыми символами utf-8, так что это, вероятно, ваша проблема.Укажите кодировку Ascii вместо utf-8, так как это то, что вы делаете

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