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