例如,给定任意字符串。可以是chars
,也可以是随机的bytes
:
string = '\xf0\x9f\xa4\xb1'
我要输出:
b'\xf0\x9f\xa4\xb1'
这似乎很简单,但是我在任何地方都找不到答案。当然,只需在字符串后键入b
即可。但我想执行此运行时,或者从包含字节字符串的变量中执行。
如果给定的string
是AAAA
或某些已知的characters
,我可以简单地做string.encode('utf-8')
,但是我希望字节字符串只是随机的。对'\xf0\x9f\xa4\xb1'
(随机字节)执行此操作会产生意外结果b'\xc3\xb0\xc2\x9f\xc2\xa4\xc2\xb1'
。
必须有一种更简单的方法吗?
编辑:
我想在不使用编码的情况下将字符串转换为字节
答案 0 :(得分:3)
Latin-1 字符编码很简单(与 Python 支持的所有其他编码不同)将 0x00-0xff 范围内的每个代码点编码为具有相同值的字节。
<xsl:template name="replace-string">
<xsl:param name="text"/>
<xsl:param name="replace"/>
<xsl:param name="with"/>
<xsl:choose>
<xsl:when test="contains($text,$replace)">
<xsl:value-of select="substring-before($text,$replace)"/>
<xsl:value-of select="$with"/>
<xsl:call-template name="replace-string">
<xsl:with-param name="text"
select="substring-after($text,$replace)"/>
<xsl:with-param name="replace" select="$replace"/>
<xsl:with-param name="with" select="$with"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$text"/>
</xsl:otherwise>
</xsl:choose>
你说你不想使用编码,但避免它的替代方法似乎差很多。
UTF-8 编码是不合适的,因为正如您已经发现的,0x7f 以上的代码点映射到多个字节(最多四个字节)的序列,其中没有一个完全是作为字节值的输入代码点。>
省略 byteobj = '\xf0\x9f\xa4\xb1'.encode('latin-1')
的参数(如现在已删除的答案中)会强制 Python 猜测编码,这会产生依赖于系统的行为(可能在大多数系统上选择 UTF-8,除了 Windows,它通常会取而代之的是选择更不可预测,通常更险恶和可怕的东西)。
答案 1 :(得分:0)
我找到了可行的解决方案
import struct
def convert_string_to_bytes(string):
bytes = b''
for i in string:
bytes += struct.pack("B", ord(i))
return bytes
string = '\xf0\x9f\xa4\xb1'
print (convert_string_to_bytes(string))
)
输出:
b'\xf0\x9f\xa4\xb1'