将HTML表单中的字符串传递给Python脚本并遵循UTF-8编码

2 投票
4 回答
1633 浏览
提问于 2025-04-16 12:50

我在一个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>

我想把文本输入作为参数传递给一个Python脚本,所以我在index.html文件里嵌入了以下的PHP代码:

<?
    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" />

我很想听听更好的方法来处理我的任务,或者对我现在的方法进行纠正。谢谢!

4 个回答

0
# -*- 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"))

这样应该可以正常工作。

1

为什么不让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:]))
0

你可以直接用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/。不过,服务器可能也需要一些配置。

最后三行是简单的HTTP头部。在我的例子里,它只是把你重定向到另一个网站,并没有内容要显示。getvalue("a","")这个函数会返回字段"a"的值,或者返回空字符串(第二个参数)。总的来说,这几乎就是一个普通的Python文件。

撰写回答