求助各路大神,这个问题已经弄了好长时间了。。。
**事情是这样的:

我的服务器环境是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

我自己进行了以下尝试:

  1. 这句在头部加与不加,问题依然存在。# -- coding: utf-8 --

  2. import sys
    sys.setdefaultencoding(‘utf-8’)
    这两句一旦加上,无法运行。

  3. print(“main1”,sys.stdout.encoding)
    print出来居然是cp936??? 明明不是说python3是utf-8么?

  4. 试着在头部import xml.etree.ElementTree as ET
    利用xmlData = ET.fromstring(web__data)获取数据,依然是相同的提示。

  5. 试着在xml=web.data()后面采用encode、decode,没有一次成功的。。。

  6. 仔细研究了两次报错,输入“中2”的时候,应当是系统把“中2”当成了“涓\udcad2”
    只输入“中”,会吞掉一个]。所以unclosed CDATA section
    输入“中文”,会被识别为“涓\udcad鏂嘳”
    所以报错主要是解码编码的原因。

  7. sublime也装上了。。。。

  8. 有人可能是看见了\udcad所以说与路径有关,我查了并不是路径原因,应该还是解码编码出了问题。

现在我知道原因了,却始终无法解决。。。。。能想到的方法都用上了,把这些字符的不同进制码也验算了一遍,就是不知道该怎么解决。。。。跪求帮助啊。。

到底该怎么弄掉这些乱码啊。。。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐