无法从Python-Flask上的输入接收Unicode值

时间:2017-08-24 01:15:59

标签: python-2.7 unicode flask

我的示例Python脚本是这样的:

# -*- coding: utf-8 -*-
from flask import *

app = Flask(__name__)


@app.route('/', methods=['GET','POST'])
def checkName():
    if request.method=='POST':
        namekh = request.form['KhmerName']

        print "Khmer name is ",namekh
        if isinstance(namekh.encode('utf8'), unicode):
            return render_template('hello.html', Name=namekh)
        else:
            namekh = 'Please enter khmer character only'
            return render_template('hello.html', Name=namekh)


    return render_template('hello.html')

if __name__ == '__main__':

    app.run(debug=True)

从上面的脚本中,我尝试在提交时从表单元素名称KhmerName接收输入值,并检查它是否是Unicode字符。然后我将它发送到我的html标记hello.html显示。

html看起来像这样:

{% if Name %}
    <p>Hello, {{Name}} wellcome to mysite</p>
{% endif %}
<form class="form-horizontal" action='' method='POST'>
  <div class="form-group">
    <label for="KhmerName" class="col-sm-2 control-label">Khmer Name:</label>
    <div class="col-sm-10">
      <input type="text" class="form-control" id="KhmerName" name="KhmerName" placeholder="KhmerName">
    </div>
  </div>
  <div class="form-group">
    <div class="col-sm-offset-2 col-sm-10">
      <button type="submit" class="btn btn-default">Submit</button>
    </div>
  </div>
</form>

但是,我的问题是,如果KhmerName是一种非字符,它是否正常工作,但它是一个Unicode字符,它将返回一条错误消息

UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-4: character maps to <undefined>

Traceback (most recent call last)
File "C:\Python27\lib\site-packages\flask\app.py", line 1997, in __call__
return self.wsgi_app(environ, start_response)
File "C:\Python27\lib\site-packages\flask\app.py", line 1985, in wsgi_app
response = self.handle_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1540, in handle_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1982, in wsgi_app
response = self.full_dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1614, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:\Python27\lib\site-packages\flask\app.py", line 1517, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:\Python27\lib\site-packages\flask\app.py", line 1612, in full_dispatch_request
rv = self.dispatch_request()
File "C:\Python27\lib\site-packages\flask\app.py", line 1598, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "F:\python\check Unicode\hello.py", line 12, in hello_world
print "Khmer name is ",namekh
File "C:\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-4: character maps to <undefined>

我在这里检查Unicode的方法是使用isinstance(namekh.encode('utf8'), unicode),因此它应该正常工作(返回true),因为如果输入值namekh的类型已经是unicode类型是一个unicode角色。然而,我不知道它为什么会像上面那样返回错误。

请帮忙。谢谢你提前。

3 个答案:

答案 0 :(得分:1)

我对一个演示项目进行了测试。从request.form["key"]返回的变量类型为unicode。因此,您无需从unicode使用str将其转换为decode。我还在演示项目上测试了សួរស្តីរ,它可以打印出来。从您提供的代码。您可能只想允许高棉字符。我认为你使用正则表达式来测试输入。

REGEX_KHMER = u"[\u1780-\u17dd\u17e0-\u17e9\u17f0-\u17f9]+"

if re.match(REGEX_KHMER, namekh):

    return correctly

else:

    return enter khmer character only

答案 1 :(得分:0)

编辑 - 我之前的回答很糟糕。我正在改进它

សួរស្តីរ中的字符不能用单个字节表示,而在python2字符串中是一个字节序列,你会遇到问题。

事实是,你可以解码为unicode 在python-2.x str中是一个字节序列,你必须将其解码为unicode,你不需要需要在python-3.x中,因为字符串已经是unicode,它们是str个对象 - 字符序列,或者如果我可以说字符抽象)和你只能编码成字节不解码

实际上,@ stamaimer建议从烧瓶中的request.form["key"]返回的数据在unicode中,因此您不需要对其进行编码,这是不可能的,这就是您收到错误的原因。

您可以这样做:

isinstance(namekh,unicode)

无需编码。但它没有意义,因为你已经有了unicode。

答案 2 :(得分:-1)

我希望这可以帮到你。

@app.route('/', methods=['GET','POST'])
def checkName():
    if request.method=='POST':
        namekh = request.form['KhmerName']

        print "Khmer name is ",namekh
        # The default namekh is unicode
        if isinstance(namekh, unicode):
            return render_template('hello.html', Name=namekh)
        else:
            namekh = 'Please enter khmer character only'
            return render_template('hello.html', Name=namekh)


    return render_template('hello.html')

as follows