【问题标题】:String Conversion python字符串转换 python
【发布时间】:2020-06-18 15:32:33
【问题描述】:

我有一个关于python3中字符串转换的小问题。

s = '\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000\x00'

print(s) -> 给出输出:

1 2 1 0 5 5 0 4 0 0

但是,当我尝试使用以下方法转换字符串时:

bytes(s, 'utf16').decode('utf16') ,我得到 '\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000\x00'。

以编程方式获得与 print(s) 相同的输出的方法是什么?

【问题讨论】:

  • 顺便说一句:第二个变种是错误的。它不是 UTF16(而是 UTF16BE)
  • 似乎 utf-16 也可以。 realpython.com/python-encodings-guide
  • 有趣,我没想到'\x00' 会打印为空白。

标签: python string encoding character-encoding


【解决方案1】:

在第一个示例中,您打印字符串s,控制台将忽略\x00。你做一个print(s)

在最后一行,您从 python 提示符获取字符串。如果你打印它:print(bytes(s,'utf-16').decode('utf-16')),你会得到你想要的。

因此 Python 提示符会向您显示带有上下文的变量(例如,您还会看到 ' 符号),但不是字符串的真实表示(print 有)。

附录:

print 将在其参数中打印字符串,最终调用str() 将参数转换为字符串。但是python提示符将打印变量的表示形式(使用repr()。所以你可以print(repr(bytes(s,'utf-16').decode('utf-16')))得到你在python交互会话中得到的相同字符串,但是作为字符串。你可以分配这样的函数而不是打印,而不是打印(@ 987654331@,所以你有r[0]'r[1]\,等等

【讨论】:

  • 感谢@Giacomo 的回答。我想通过 print(str(s)) 对打印出来的字符串执行操作。有没有办法将打印输出存储到变量或更好的方法?
  • str(s) 如果s 已经是一个字符串,则为空操作。如果你不使用print,Python 在控制台上打印的实际上是repr(s)
  • @MarkRansom 对。这是草稿的剩余部分。我想用repr 指向str,但它也不是那么有用。我将编辑掉 str
  • @sk1pro99:我添加了关于如何在第二种情况下获取字符串的内容。第一种情况(但第二种情况)的准确输出很困难,它取决于控制台(和字体)。 \x00 在 Unicode 中没有意义,因此不会打印,但其他控制字符可能会有不同的解释。然后是所有组合字符(和代码点)。 repr() 通过转义来避免控制字符和 困难 字符。还有一个警告:您的代码可能在 Unix/Macos(现在默认为 Unicode)中工作,但在 Windows 上您可能会得到不同的输出。
【解决方案2】:

你只需要解码这个二进制文件,你就会得到答案

x = b'\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000\x00'
str1 = x.decode('utf-8')
print(" ".join([i for i in str1 if ord(i) != 0]))

第二种解决方案:

x = '1 2 1 0 5 5 0 4 0 0'
str_utf32 = x.encode('utf16')
print("Encoding :",str_utf32)
print("Decoding :",str_utf32.decode('utf16'))

输出

Encoding : b'\xff\xfe1\x00 \x002\x00 \x001\x00 \x000\x00 \x005\x00 \x005\x00 \x000\x00 \x004\x00 \x000\x00 \x000\x00'
Decoding : 1 2 1 0 5 5 0 4 0 0

【讨论】:

  • 您建议如何将 s 转换为 x? x = 字节(s,'utf-8')。如果我然后执行 bytes(x, 'utf-8').decode('utf-8'),我会得到相同的字符串 '\x001\x002\x001\x000\x005\x005\x000\x004\x000\x000 \x00'。虽然如果我使用打印,我会得到转换后的字符串。
猜你喜欢
  • 2018-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-19
相关资源
最近更新 更多