【问题标题】:Passing a string from a form in html-file to a python-script respecting utf-8 encoding将字符串从 html 文件中的表单传递到尊重 utf-8 编码的 python 脚本
【发布时间】:2011-07-07 09:41:39
【问题描述】:

我在 index.html 文件中有这个表单。

<form method="post" action="index.php" accept-charset="UTF-8">
    <input id="a" name="a" type="text">
    <input type="submit" name="run_query" value="Add User" size="30">
</form>

我正在尝试通过将以下 php 代码嵌入到 index.html 文件中,将文本输入作为参数传递给 pyton 脚本:

<?
    session_start();
    ob_start();
    if(isset($_REQUEST['run_query'])) {
    $add_user = $_REQUEST['a'];
    $command = "add_author.py $add_user";
        exec($command); 
    }
?>

我已将 add_author.py 文件放入 index.html 所在的同一文件夹中。它适用于任何字符串。但是如果我尝试使用包含 ä ö é 的字符串,它就不起作用了。

python 文件如下所示。

import sys
import codecs
if __name__ == '__main__':
    wFile = codecs.open("test.txt", "w", "utf8")
    wFile.write(" ".join(sys.argv[1:]))
    wFile.close()

顺便说一句:index.html 中有这一行。

<meta charset="utf-8" />

我很想听到更好的方法来管理我的任务或纠正我的方法。谢谢!

【问题讨论】:

  • 什么是操作系统?系统编码是什么?

标签: php python html encoding utf-8


【解决方案1】:
# -*- coding: utf-8 -*-

在你的文件顶部应该强制 utf 编码。

# -*- coding: utf-8 -*-
import sys

if __name__ in '__main__':
    with open('test.txt','w') as out:
        out.write(''.join(sys.argv[1:]).encode("utf-8"))

应该没问题

【讨论】:

  • 您发布的第一行在 python 中强制使用 utf8 是否意味着每个字符串都将出现在 utf8 中,而不像 python 中的标准(即 unicode)?
  • 我试用了您的代码,但没有解决问题。如果我传递纯 ascii 的字符串,它就可以工作。但是对于包含非 ascii 字符的字符串,它不起作用。
【解决方案2】:

为什么不让 PHP 写入文件而不是调用另一个 python 脚本?

if (!$handle = fopen("test.txt", 'a')) {
    echo "Cannot open file ($filename)";
    exit;
}

if (fwrite($handle, $_REQUEST['a']) === FALSE) {
    echo "Cannot write to file ($filename)";
    exit;
}

如果您坚持使用 python 脚本,您可能需要先对其进行编码,但通常使用此处所述的不同方法进行检查: http://docs.python.org/howto/unicode.html 我的猜测是你只需要在字符串上调用 unicode()

wFile.write(unicode(sys.argv[1:]))

【讨论】:

  • 我需要 pyton 脚本。 “写入文件只是一个测试用例”我想用 python 做更多的处理。
【解决方案3】:

您可以直接将 Python 与 CGI 结合使用。它应该比从 PHP 调用 Python 更快。它也应该更容易配置。

简单的例子。

#!/usr/bin/python

import cgi;
import codecs;

form = cgi.FieldStorage()
my_a = form.getvalue("a","")

wFile = codecs.open("test.txt", "w", "utf8")
wFile.write(my_a);
wFile.close()

print("Content-Type: text/plain")
print("Location: ../plain.html")
print()

您必须将此 python 文件放入 CGI 脚本的目录中。最常见的是/cgi-bin/。好吧,服务器可能也需要一些配置。

最后 3 行是简单的 http 标头。在我的示例中,它只是重定向到其他站点。没有要显示的内容。 getvalue("a","") 将返回字段“a”的值或空字符串(第二个参数)。嗯,几乎是普通的 Python 文件。

【讨论】:

  • 我是网络编程新手。请给我一个例子,你将如何通过 CGI 实现这个例子?
  • 这个拯救了我的一天!非常感谢或者例子。我想我会对 cgi 编程有更深入的了解。它似乎比我迄今为止尝试的解决方法更能解决问题。谢谢!
【解决方案4】:

PHP 代码的实际问题似乎是添加到“命令”的参数“$add_user”没有以任何方式进行转义或保护。 这使得可以将任何内容发送到“exec”中,从而使系统容易受到攻击。网络漫画 XKCD 有一个关于这个问题的“有趣”例子:http://xkcd.com/327/

您看到的原因是 UTF-8 编码的“åäö”以无法打印的字节开头,这会在许多旧 shell 中导致问题,具体取决于系统配置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多