繁体   English   中英

如何通过Django打印在网页中显示的C中从0到255的ASCII字符?

[英]How to print out ascii characters from 0 to 255 in C, displayed in a webpage through Django?

我正在为学校做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代码一起使用。 我在视图中添加了一条打印语句,以验证代码的输出是否已正确发送到浏览器,并且它在终端(而不是浏览器)中正​​确显示。 实际上,它根本没有在浏览器中显示。 经过进一步检查,该页面的标记中绝对没有任何内容,该页面通常不会显示代码的输出。 我猜想这与字符编码有关。 有任何想法吗?

编辑:我忘了提到我的模板中,我使用meta标签将字符编码指定为utf-8。

编辑2:我的一个朋友的版本显示在Windows上以utf-8格式保存在http://geekingreen.dyndns.org/week02/Assignment-5上的文本文件的内容,但是如果他尝试显示该页面通过可执行文件的输出,他遇到了与我相同的问题。

哈,找到了一种方法,至少可以将其呈现到页面上,字符无法正确显示,但至少可以将某些内容呈现到页面上。

代码就是这样的:

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')

就像咒符一样工作,尽管似乎仍然缺少一些字符,它比以前的方法显示的更多。

值128..255的原始字节不是有效的utf-8字符,因此这可能是您的问题。 指定一个Ascii编码而不是utf-8,因为这就是您要做的

很有可能字符编码不是问题。 尽管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标记为已弃用。

正如其他人试图说的那样,您只需要使用正确的编码即可。

output = popen2.popen2(file_sh)[0].read().decode('cp1252')

提示:考虑一下ÿ(&#254;),ÿ(&#255;)或μ(&#956;)。 只需删除空格以获取字符。

您可以轻松地进行计数:

for i in range(256):
    print '&#%s;<br/>\n' % i

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM