我的示例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角色。然而,我不知道它为什么会像上面那样返回错误。
请帮忙。谢谢你提前。
答案 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')