Python:删除字符串中的^A

2024-04-24 23:52:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我从数据库中得到一个包含奇怪字符的字符串,这些字符会打断json字符串。在

以下是json字符串:

{"id":13,"code":"cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@","label":"Anonymous lifestyle App cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@"}

看起来还可以,但是在i和K之间有“^A”(2B2[h1s`lNzF@sPC1FtaCiK0VF@),我们无法从这里看到它,但如果您将其复制到文本编辑器,它将显示出来。在

我的问题是如何使这个json字符串可解析?或者如何使用Python删除“^A”?在


Tags: 字符串id数据库jsonappcode字符label
3条回答

how to use Python to remove '^A'?

如果您打开终端并使用真正的ASCII ^A字符执行以下操作(要编写它,您需要执行C-vC-a):

>>> print ord('^A')
1

因此,您知道必须从字符串中删除ASCII控制字符1

^{pr2}$

如果从ASCII表中引用:

ascii table
(来源:asciitable.com

这是“开始标题”代码,通常用于获取shell中行的开头。在

注:

  • 函数ord()给出一个字符的int等价物(在python中是一个单字符字符串)
  • 函数chr()给出相当于ascii字符的字符串
  • 在ASCII中,可打印字符在32126之间

My question is how to make this json string parsable?

最后,无法让JSON解析您提供的精确字符串,因为JSON只处理可打印字符,因此不包含控制字符(当通过套接字或tty端口提供时,这可能会产生不良的副作用)。换句话说,一个包含ASCII控制字符的JSON字符串是JSON。在

在不知道上下文的情况下,如果希望JSON数据只以一种方式工作(内射函数),可以在构建JSON字符串之前从字段(和名称)中删除控制字符。你也可以使用一个散列函数,这样可以使它更小,看起来更好。在

不过,如果您希望它是对称的(双射),您最好将code转换成一个整数列表,或者使用base64这样的代码对其进行编码:

使用base64:

>>> import base64
>>> bcode = base64.encodestring(code)
>>> bcode
'Y2Zsd2AyQjJbaDFzYGxOekZAc1BDMUZ0YUNpSwEwVkZA\n'
>>> base64.decodestring(bcode)
'cflw`2B2[h1s`lNzF@sPC1FtaCiK\x010VF@'

或作为整数列表:

>>> lcode = [ord(c) for c in code]
>>> lcode
[99, 102, 108, 119, 96, 50, 66, 50, 91, 104, 49, 115, 96, 108, 78, 122, 70, 64, 115, 80, 67, 49, 70, 116, 97, 67, 105, 75, 1, 48, 86, 70, 64]
>>> "".join([chr(c) for c in lcode])
'cflw`2B2[h1s`lNzF@sPC1FtaCiK\x010VF@'

生成json字符串:

{"id":13,"code":"Y2Zsd2AyQjJbaDFzYGxOekZAc1BDMUZ0YUNpSwEwVkZA\n","label":"Anonymous lifestyle App cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@"}

或者

{"id":13,"code":[99, 102, 108, 119, 96, 50, 66, 50, 91, 104, 49, 115, 96, 108, 78, 122, 70, 64, 115, 80, 67, 49, 70, 116, 97, 67, 105, 75, 1, 48, 86, 70, 64],"label":"Anonymous lifestyle App cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@"}

但最后,在构建JSON之前,您需要在编码时,而不是在解码时,从字符串中删除^A控制字符

^A是ASCII码的UNIX语言0x01(在tty中,相当于Ctrl+a)。在

实际上,您不应该获取JSON字符串中的原始二进制数据,应该修复生产者(一种典型的方法是base64对二进制数据进行编码)。在

但是,根据您的数据,您可以使用以下命令删除此特定字符:

yourstring.replace(chr(1), "")

或使用以下命令删除所有控制字符:

^{pr2}$
json_str = '{"id":13,"code":"cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@","label":"Anonymous lifestyle App cflw`2B2[h1s`lNzF@sPC1FtaCiK0VF@"}'
print map(ord, json_str)

这将得到一个整数unicode代码数组。找到您想要删除的整数unicode代码,然后使用Python的内置代码进行查找/替换结构更换(旧的,新的)

相关问题 更多 >