求助各路大神,这个问题已经弄了好长时间了。。。
**事情是这样的:
我的服务器环境是windows2008R2,利用apache24+anaconda-python37+web.py搭载,试图开发微信公众号。
程序参考微信公众号的文档搭建。
_**
main.py代码为:
#!python
# filename: main.py
import web
from view import Handle
urls = (
'/', 'Handle',
)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
view.py代码为:
## #!python
## # filename: view.py
## #下方import是验证不同方法时留下的。
import hashlib
import web
from wechatpy import parse_message
from wechatpy.replies import TextReply
import django
from django.http.response import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from wechatpy import parse_message, create_reply
import chardet
import codecs
class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "ok"
else:
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token ='******'
list = [token,timestamp,nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode("utf-8"))
sha1.update(list[1].encode("utf-8"))
sha1.update(list[2].encode("utf-8"))
hashcode = sha1.hexdigest()
if hashcode == signature:
return echostr
else:return ""
except Exception as Argment:
return Argment
def POST(self):
try:
xml = web.data()
print(xml)
print(111)
msg = parse_message(xml)
print(msg)
if msg.type == 'text':
try:
print('2222')
reply = create_reply('这是条文字消息', msg)
response = HttpResponse(reply.render(), content_type="application/xml")
return response
except Exception as Argment:
return"success"
except Exception as Argment:
return Argment
在微信公众号上运行自然是出错,利用微信提供的后台进行debug,当content为“1”时,程序能够成功。
如果是“中”,提示报错:
Server: Apache/2.4.37 (Win64) mod_wsgi/4.5.24 Python/3.7 OpenSSL/1.1.0j
Content-Type: text/html
unclosed CDATA section: line 1, column 276<xml>
<URL>
<![CDATA[http://212.64.93.235/cgi-bin/main.py/]]>
</URL>
<ToUserName>
<![CDATA[guan2063]]>
</ToUserName>
<FromUserName>
<![CDATA[averyjanus]]>
</FromUserName>
<CreateTime>1</CreateTime>
<MsgType>
<![CDATA[text]]>
</MsgType>
<Content>
<![CDATA[中]]>
</Content>
<MsgId>1</MsgId>
</xml>
111
如果是“中文”,提示报错:
‘utf-8‘ codec can‘t encode character ‘\udcad‘ in position 241: surrogates not allowed
<xml> <URL> <![CDATA[http://212.64.93.235/cgi-bin/main.py/]]> </URL> <ToUserName> <![CDATA[guan2063]]> </ToUserName> <FromUserName> <![CDATA[averyjanus]]> </FromUserName> <CreateTime>1</CreateTime> <MsgType> <![CDATA[text]]> </MsgType> <Content> <![CDATA[中文]]> </Content> <MsgId>1</MsgId> </xml> 111
我自己进行了以下尝试:
-
这句在头部加与不加,问题依然存在。# -- coding: utf-8 --
-
import sys
sys.setdefaultencoding(‘utf-8’)
这两句一旦加上,无法运行。 -
print(“main1”,sys.stdout.encoding)
print出来居然是cp936??? 明明不是说python3是utf-8么? -
试着在头部import xml.etree.ElementTree as ET
利用xmlData = ET.fromstring(web__data)获取数据,依然是相同的提示。 -
试着在xml=web.data()后面采用encode、decode,没有一次成功的。。。
-
仔细研究了两次报错,输入“中2”的时候,应当是系统把“中2”当成了“涓\udcad2”
只输入“中”,会吞掉一个]。所以unclosed CDATA section
输入“中文”,会被识别为“涓\udcad鏂嘳”
所以报错主要是解码编码的原因。 -
sublime也装上了。。。。
-
有人可能是看见了\udcad所以说与路径有关,我查了并不是路径原因,应该还是解码编码出了问题。
现在我知道原因了,却始终无法解决。。。。。能想到的方法都用上了,把这些字符的不同进制码也验算了一遍,就是不知道该怎么解决。。。。跪求帮助啊。。
到底该怎么弄掉这些乱码啊。。。