如果字符串未硬编码,脚本中的Python编码问题

如果字符串未硬编码,脚本中的Python编码问题,python,string,encoding,utf-8,Python,String,Encoding,Utf 8,我从外部源获取的字符串存在编码问题。 该源将编码的字符串发送给我,只有当它们是脚本代码的一部分时,我才能对它们进行解码。 我在这里看了几篇文章,甚至还有一些推荐的教程(比如一篇),但都是空的 例如,如果我运行以下命令: python -c 'print "gro\303\237e"' 我得到: große 这是正确的结果 但如果我在脚本中使用它,例如: import sys print sys.argv[1] 把它叫做test.py“gro\303\237e”,我得到: gro\303\2

我从外部源获取的字符串存在编码问题。 该源将编码的字符串发送给我,只有当它们是脚本代码的一部分时,我才能对它们进行解码。 我在这里看了几篇文章,甚至还有一些推荐的教程(比如一篇),但都是空的

例如,如果我运行以下命令:

python -c 'print "gro\303\237e"'
我得到:

große
这是正确的结果

但如果我在脚本中使用它,例如:

import sys
print sys.argv[1]
把它叫做
test.py“gro\303\237e”
,我得到:

gro\303\237e
我打算将正确的字符串写入syslog,但似乎无法使其正常工作

我的系统上的一些数据: -Python 2.7.10 -CentOS Linux -LANG=en_US.UTF-8 -LC_CTYPE=UTF-8

我将感谢任何帮助,如果您需要更多信息,请告诉我。 谢谢

这将起作用:

import sys
import ast
print ast.literal_eval('b"%s"' % sys.argv[1]).decode("utf-8")
但请先阅读,以确保它适合您的需要(我认为它应该安全使用,但您应该阅读并确保)。

这将起作用:

import sys
import ast
print ast.literal_eval('b"%s"' % sys.argv[1]).decode("utf-8")

但是,请先阅读,以确保它符合您的需要(我认为它应该是安全的,但您应该阅读并确保)。

如果您真的有chars
gro\303\237e
这是另一种东西,如
“gro\303\237e”
(第一个是chars g r o\3 03\2 3 7,第二个是chars g r oße)您可以使用
解码(“转义字符串”)
,如中所述


请注意,无论是谁生成了数据,这可能是一个编码错误。因此,它可能包含使用此方法无法修复的其他错误。

如果您确实拥有字符
gro\303\237e
,它是另一种类型的
“gro\303\237e”
(第一个是字符g r o\3\2 3 7,第二个是字符g r oße),您可以使用
解码(“转义字符串”)


请注意,无论是谁生成了数据,这可能是一个编码错误。因此,它可能包含使用此方法无法修复的其他错误。

只需使用
test.py“große”
调用脚本即可。我会,但我不控制输入字符串。它已经编码好了。谢谢。
\xxx
中的字符串文字被解释为转义序列,但仅在字符串文字中更重要的是,
\303\237
作为“ß”的转义序列相当于。。。不寻常。似乎那个字符串的编码出错了。如果你用同样的方法正确地解码,你可以得到正确的结果,但是这应该是什么类型的转义,你能在源代码处纠正它吗?你可以通过看起来像转义序列代表原始字节的,将这些字节解释为UTF-8会产生所需的结果。只需使用
test.py“große”
调用脚本即可。我会,但我不控制输入字符串。它已经编码好了。谢谢。
\xxx
中的字符串文字被解释为转义序列,但仅在字符串文字中更重要的是,
\303\237
作为“ß”的转义序列相当于。。。不寻常。似乎那个字符串的编码出错了。如果你用同样的方法正确地解码,你可以得到正确的结果,但是这应该是什么类型的转义,你能在源代码处纠正它吗?你可以通过看起来像转义序列代表原始字节的,将这些字节解释为UTF-8会产生所需的结果。感谢您的提示,但我在代码中遇到了另一个错误:UnicodeEncodeError:“ascii”编解码器无法对第3位的字符u'\xdf'进行编码:序号不在范围内(128)。这很奇怪,我尝试了“python test.py”gro\303\237e“,它可以在windows和linux(ubuntu)上运行使用python 2.7.6。什么输入不适合您?这是输入:“gro\303\237e”是的,但是您如何调用python脚本?和我一样?你可以在这里在线查看,顺便说一句:我称之为test.py“gro\303\237e”。您发送的链接是针对代码中包含的字符串的,正如我在问题中所说的,当它工作时,就像我在问题中所说的。感谢您的提示,但我在代码中遇到了另一个错误:UnicodeEncodeError:“ascii”编解码器无法对位置3中的字符u'\xdf'进行编码:序号不在范围内(128)。这很奇怪,我尝试了“python test.py”gro\303\237e它可以在windows和linux(ubuntu)上使用python 2.7.6。什么输入不适合您?这是输入:“gro\303\237e”是的,但是您如何调用python脚本?和我一样?你可以在这里在线查看,顺便说一句:我称之为test.py“gro\303\237e”。您发送的链接是针对代码中包含的字符串的,正如我在问题中所说的,这是它工作的时候。谢谢您,@syntonym。这帮了大忙,结果证明是唯一有效的答案。也要感谢所有参与进来的人。你的贡献很重要!谢谢你,@syntonym。这帮了大忙,结果证明是唯一有效的答案。也要感谢所有参与进来的人。你的贡献很重要!