如何在Django网页中打印C语言中0到255的ASCII字符?
我正在做一个学校的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,但是如果他尝试用可执行文件的输出显示那个页面,他也遇到了和我一样的问题。
5 个回答
0
正如其他人所说的,你只需要使用正确的编码方式。
output = popen2.popen2(file_sh)[0].read().decode('cp1252')
0
值在128到255之间的原始字节不是有效的utf-8字符,所以这可能就是你的问题所在。你应该选择Ascii编码,而不是utf-8,因为你现在使用的就是utf-8。
1
哈哈,我找到了一种方法,至少可以让它在页面上显示出来,虽然字符显示得不太正确,但至少页面上有东西显示。
代码就是这么简单:
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')
效果非常好,虽然还是有一些字符缺失,但比之前的方法显示的内容多了。