Python 更改字符串中单个字符的编码
我正在尝试创建一个脚本,该脚本将更改字符串中单个字符的编码:Python 更改字符串中单个字符的编码,python,string,python-2.7,character-encoding,Python,String,Python 2.7,Character Encoding,我正在尝试创建一个脚本,该脚本将更改字符串中单个字符的编码: import random import chardet def tamper(payload): data_range = range(0, len(payload)) accepted_encodings = ["iso-8859-1", "iso-8859-15", "utf-8", "ascii", "iso-8859-2"] tampered_p
import random
import chardet
def tamper(payload):
data_range = range(0, len(payload))
accepted_encodings = ["iso-8859-1", "iso-8859-15", "utf-8", "ascii",
"iso-8859-2"]
tampered_payload = []
for i, char in enumerate(list(payload)):
if i == random.choice(data_range):
tampered_payload.append(char.replace(char, char.encode(random.choice(accepted_encodings))))
else:
tampered_payload.append(char)
return ''.join(tampered_payload)
当我通过chardet.detectc运行此命令时,它会输出以下内容:
if __name__ == '__main__':
for c in tamper("SELECT * FROM *"):
print chardet.detect(c)
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
{'confidence': 1.0, 'encoding': 'ascii'}
现在我知道,由于随机函数的缘故,这个脚本不能保证更改字符串中的编码,但为什么不管我做什么,即使字符使用一种可接受的编码进行了重新编码,它也总是输出为ascii,python是否总是将字符串中的字符转换为ascii
我也尝试使用编解码器进行编码:
它似乎做了同样的事情,这让我相信,A我是个白痴,我遗漏了一些最有可能的情况,B这是chardet本身的问题。您所有的编码都包括ASCII码作为子集。只要您的原始字符都在ASCII范围内,任何编码都不会改变它们。无论如何,我不相信单个字符上的chardet-这不足以识别特定的非ASCII编码。@jasonharper所以无论我将它们编码成什么,子集总是优先于编码?这不是优先级的问题,事实上,大多数编码在基本字母/数字/等的表示方式上与ASCII一致:例如,它们都将A编码为字符65。英语中不常用的字符编码不同——重音元音、其他字母的字母、特殊符号、,依此类推。@jasonharper那么有没有办法只对字符串中的一个字符进行编码,并判断它是否成功工作?如果编解码器无法对特定字符进行编码,则会引发异常。
import random
import chardet
import codecs
def tamper(payload):
accepted_encodings = ["iso-8859-1", "iso-8859-15", "utf-8",
"iso-8859-2"]
test = "string"
to_encode = random.choice(accepted_encodings)
print to_encode
codecs.encode(test, to_encode)
print chardet.detect(test)
if __name__ == '__main__':
tamper("SELECT * FROM *")
# <= {'confidence': 1.0, 'encoding': 'ascii'}