更改字符串中单个字符的编码

时间:2017-03-02 17:17:55

标签: 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_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.detect(c)运行时,会输出以下内容:

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?

我也尝试使用codecs进行编码:

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'}

它似乎做了同样的事情,这让我相信,A)我是一个白痴,我缺少一些东西(很可能是个案)或B)这是chardet本身的问题。

0 个答案:

没有答案