[英]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.