【问题标题】:Python encoding issue in script if string not hard-coded如果字符串未硬编码,则脚本中的 Python 编码问题
【发布时间】:2016-04-12 11:07:57
【问题描述】:

我从外部来源获得的字符串存在编码问题。 此源将编码的字符串发送给我,只有当它们是脚本代码的一部分时,我才能对其进行解码。 我在这里查看了几个线程,甚至查看了一些推荐的教程(例如 this 之一),但都没有找到。

例如,如果我运行这个:

python -c 'print "gro\303\237e"'

我明白了:

große

哪个是正确的结果。

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

import sys
print sys.argv[1]

并称它为test.py "gro\303\237e",我明白了:

gro\303\237e

我打算将正确的字符串写入系统日志,但我似乎无法让它工作。

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

我将不胜感激,如果您需要更多信息,请告诉我。 谢谢!

【问题讨论】:

  • 只需使用test.py "große" 调用您的脚本。
  • 我会,但我不控制输入字符串。它已经编码到达。谢谢。
  • \xxxstring literal 中被解释为转义序列,但 only 在字符串文字中。 – 不仅如此,\303\237 作为“ß”的转义序列相当...不寻常。似乎该字符串的编码出错了。如果您以相同的方式解码它(不)正确,您可以获得正确的结果,但是应该是什么样的转义,您可以从源头纠正它吗?
  • 你可以通过this SO answer取消转义(而不是解码,虽然它有点像)
  • 看起来转义序列代表原始字节,将这些字节解释为 UTF-8 会产生所需的结果。

标签: python string encoding utf-8


【解决方案1】:

如果你真的有字符 gro\303\237e 这是别的东西 "gro\303\237e" (第一个是字符 g r o \ 3 0 3 \ 2 3 7,第二个是字符 g r o ß e)你可以使用decode("escape_string")this SO answer 中所述

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

【讨论】:

  • 谢谢你,@syntonym。这很有帮助,结果证明是唯一有效的答案。也感谢所有其他参与的人。您的贡献很重要!
【解决方案2】:

这将起作用:

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

但请先阅读literal_eval 以确保它符合您的需求(我认为它应该可以安全使用,但您应该阅读并确认)。

【讨论】:

  • 感谢您的提示,但该代码出现不同的错误:UnicodeEncodeError: 'ascii' codec can't encode character u'\xdf' in position 3: ordinal not in range(128)
  • 这很奇怪,我尝试了'python test.py "gro\303\237e"',它可以在带有 python 2.7.6 的 windows 和 linux (ubuntu) 上运行。什么是不适合您的确切输入?
  • 这是输入:“gro\303\237e”
  • 是的,但是你是如何调用 python 脚本的?和我一样吗?你可以在这里在线查看:repl.it/CEg1/0
  • 我把它称为我在问题中发布的那样:test.py "gro\303\237e"。您发送的链接适用于代码中包含的字符串,就像我在问题中所说的那样,它是有效的。
猜你喜欢
  • 2014-01-08
  • 2012-02-22
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
相关资源
最近更新 更多