Python 使用np.matrix和np.chararray时的编码错误

Python 使用np.matrix和np.chararray时的编码错误,python,encoding,utf-8,Python,Encoding,Utf 8,我正在用西班牙语建立一个Flask网站,供人们通过邮件编码发送信息。基本上,您将文本粘贴到文本字段中,它将返回其编码版本。函数OK下面的函数encode()和decode(),直到它处理重音字符和其他非标准字符。我的默认系统编码是“ascii”,我相信使用numpy.matrix和numpy.chararray可能会出现问题,这可能会更改字符串的编码 当我在下面的Sublime Text 2中构建代码并进行测试时,我得到一个: SyntaxError: Non-ASCII character '

我正在用西班牙语建立一个Flask网站,供人们通过邮件编码发送信息。基本上,您将文本粘贴到文本字段中,它将返回其编码版本。函数OK下面的函数encode()和decode(),直到它处理重音字符和其他非标准字符。我的默认系统编码是“ascii”,我相信使用numpy.matrix和numpy.chararray可能会出现问题,这可能会更改字符串的编码

当我在下面的Sublime Text 2中构建代码并进行测试时,我得到一个:

SyntaxError: Non-ASCII character '\xc3'... but no encoding declared;
see http://www.python.org/peps/pep-0263.html for details
当我加上

#!/usr/bin/env python
#-*- coding: utf-8 -*-
对于在ST2中运行的代码,它也会抛出一个错误,并且解码的消息缺少某些字符,如下所示:

[Decode error - output not utf-8]

La cr  a del le  n tiene dos a  os. 
当我使用Flask在本地服务器上运行它时,我得到:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xed' in position 0: ordinal not in range(128)
我尝试了chardet包,矩阵中的项目被识别为“windows-1252”。我使用“windows-1252”和“cp1252”解码矩阵中的项目,但问题仍然存在。在上一次解码(即使用“windows-1252”)后,我尝试使用“utf-8”进行编码,但不起作用。我怀疑这是一个编码问题,但我不能完全确定。非常感谢任何关于如何解决此问题的线索

代码如下:

import numpy as np
import random, string, re

def encode(message, size, token):
        """Assumes message is a string, size is the size limit of the message,
        and token is a string with unique characters, i.e. bufalo but not rana"""

        message = list(message)

        while len(message) < size:
            sgn = random.choice(['*', '?', '&', '@'])
            message.append(sgn)

        matrix = np.matrix(message)
        cols = size/5

        matrix = matrix.reshape((cols, 5)).T
        encoded = np.chararray(shape=(cols,5)).T

        token = token.lower()
        token = list(token)
        new = []
        for i in token:
            new.append(sorted(token).index(i))

        while len(new) > 5:
            for i in new:
                if i >= (5):
                    new.remove(i)

        old = range(0,5)

        for o, n in zip(old, new):
            encoded[np.ix_([n], range(0, matrix.shape[1]))] = matrix[np.ix_([o], range(0, matrix.shape[1]))]

        encoded_str = ''
        for i in range((encoded.size)):
            encoded_str += encoded.item(i)

        return encoded_str

#########################################
#THIS IS A TEST
#########################################
mssg = "La cría del león tiene dos años."
print encode(mssg, 120, 'bufalo')
#########################################

def decode(message, size, token):
        message = list(message)

        while len(message) < size:
            sgn = random.choice(['*', '?', '&', '@'])
            message.append(sgn)

        matrix = np.matrix(message)

        cols = size/5
        matrix = matrix.reshape((5, cols))

        token = token.lower()
        token = list(token)
        new = []
        for i in token:
            new.append(sorted(token).index(i))
        while len(new) > 5:
            for i in new:
                if i >= (5):
                    new.remove(i)
        old = range(0,5)

        decoded = np.chararray(shape=(cols,5)).T
        for n, o in zip(old, new):
            decoded[np.ix_([n], range(0, matrix.shape[1]))] = matrix[np.ix_([o], range(0, matrix.shape[1]))]

        decoded =decoded.T

        decoded_str = ''
        for i in range((decoded.size)):
            decoded_str += decoded.item(i)

        decoded_str = re.sub('[^a-zA-Z0-9\n\.]', ' ', decoded_str)
        return decoded_str
将numpy导入为np
导入随机、字符串、重
def编码(消息、大小、令牌):
“”“假定消息是字符串,大小是消息的大小限制,
令牌是具有唯一字符的字符串,即bufalo,但不是rana“”
消息=列表(消息)
而len(message)5:
我在纽约:
如果i>=(5):
新.删除(i)
旧=范围(0,5)
对于拉链中的o,n(旧的,新的):
编码的[np.ix([n],范围(0,矩阵形状[1])]=矩阵[np.ix([o],范围(0,矩阵形状[1])]
编码的_str=''
对于范围内的i((encoded.size)):
编码的\u str+=编码的项目(i)
返回编码的
#########################################
#这是一个测试
#########################################
mssg=“La cría del león tiene dos años。”
打印编码(mssg,120,‘bufalo’)
#########################################
def解码(消息、大小、令牌):
消息=列表(消息)
而len(message)5:
我在纽约:
如果i>=(5):
新.删除(i)
旧=范围(0,5)
解码=np.chararray(形状=(cols,5)).T
对于拉链中的n,o(旧的,新的):
已解码的[np.ix_u([n],范围(0,矩阵形状[1])]=矩阵[np.ix_([o],范围(0,矩阵形状[1])]
已解码=已解码.T
已解码的_str=''
对于范围内的i((decoded.size)):
已解码\u str+=已解码。项目(i)
已解码\u str=re.sub(“[^a-zA-Z0-9\n\.]”,已解码\u str)
返回解码字符

您需要做几件事来修复代码

1) 由于您的代码包含unicode字符,因此添加
#-*-编码是有意义的:utf-8-*-

2) 测试字符串应该是unicode字符串。所以这条线应该是

mssg = u"La cría del león tiene dos años."
3)
encoded
数组(从
encoded=np.chararray(shape=(cols,5)).T行开始)默认为ascii字符串。你应该把电话改成

encoded = np.chararray(shape=(cols,5), unicode=true).T
i、 e.您需要添加参数
unicode=true

然后,代码将运行并打印此结果

lt a?@&*@*&&&*&*&*?&?*Lílnnss&*@&&*@&??&?&@**?aa  e .@?*@&&@?@?*@?@?&?cdeidñ*&??&?**@*@*@&*&?@reóeoo&**&?@?&&??&@@??&&

您需要做几件事来修复代码

1) 由于您的代码包含unicode字符,因此添加
#-*-编码是有意义的:utf-8-*-

2) 测试字符串应该是unicode字符串。所以这条线应该是

mssg = u"La cría del león tiene dos años."
3)
encoded
数组(从
encoded=np.chararray(shape=(cols,5)).T行开始)默认为ascii字符串。你应该把电话改成

encoded = np.chararray(shape=(cols,5), unicode=true).T
i、 e.您需要添加参数
unicode=true

然后,代码将运行并打印此结果

lt a?@&*@*&&&*&*&*?&?*Lílnnss&*@&&*@&??&?&@**?aa  e .@?*@&&@?@?*@?@?&?cdeidñ*&??&?**@*@*@&*&?@reóeoo&**&?@?&&??&@@??&&

也许可以尝试定义你的字符串,比如:
u'La cria del león tiene dos años.
-可能会有帮助。也许可以尝试定义你的字符串,比如:
u'La cria del león tiene dos años.
-可能会有帮助。谢谢,这很有帮助。我能够解决Sublime Text 2中的问题,方法是进行建议的两个更改,并在decode()函数结束之前添加decoded_str=decoded_str.encode(“utf-8”)。另外,我不得不去掉decoded_str=re.sub(“[^a-zA-Z0-9\n\.]”,decoded_str),而是使用字符串中的替换方法删除['*','?','&','@'](utf-8编码后)。为了在Flask上工作,我删除了最终的utf-8编码,保留了新的替换方法,因为我得到了一个UnicodeDecodeError。很高兴知道!如果我的回答解决了您的问题,请接受。您知道这在Flask中有效而在ST2中无效的原因是否与使用不同默认编码的两个有关?我相信decoded_str=re.sub(“[^a-zA-Z0-9\n\.]”,decoded_str)去除了unicode中的重要字符,因此在打印时省略了重音和其他特殊字符。对不起,我不是Supreme Text的专家谢谢,这很有帮助。我通过提出两个修改建议和一个新的解决方案,解决了升华文本2中的问题