Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改字符串中单个字符的编码_Python_String_Python 2.7_Character Encoding - Fatal编程技术网

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