【问题标题】:Convert a character to 16 bits of unicode encoding [closed]将字符转换为 16 位 unicode 编码 [关闭]
【发布时间】:2012-09-07 09:57:09
【问题描述】:

我有一个 UTF-8 字符,我想将其转换为 16 位的 unicode 编码。怎么做?

可以通过读取写入它的文件并使用 repr() 来获得字符的 Unicode,例如:

import codecs
f = codecs.open("a.txt",mode='rb',encoding='utf-8')
r = f.readlines()
for i in r:
    print i,repr(i)

输出:

پٹ u'\ufeff\u067e\u0679'

现在如何获得u'\ufeff\u067e\u0679' 的 16 位 unicode 编码?

【问题讨论】:

  • “Unicode 编码”不是一个正确的术语。您是在谈论 UCS-2、UTF-16 还是 Unicode 代码点?
  • 值得注意的是,0xfeff 位在这里只是作为字节顺序标记,它不是文本的一部分。
  • 从这里看起来不像 utf-8。 \u 通常表示一个 unicode 代码点。从那里您可以以不同的格式对其进行编码,但尚不清楚您要做什么。请尝试更详细地解释您的问题。

标签: python unicode


【解决方案1】:

所以,如果你的字符串在s:

s_enc = s.encode("utf-16")
hex_string = "".join([format(i, "X").rjust(2,"0") for i in s_enc])
bin_string = "".join([format(i, "b").rjust(8,"0") for i in s_enc])

我想这就是你所追求的? (在 py3k 中测试,但我认为应该在 2 中工作)。

编辑:需要对 Python 2x 稍作修改:

s_enc = s.encode("utf-16")
hex_string = "".join([format(ord(i), "X").rjust(2,"0") for i in s_enc])
bin_string = "".join([format(ord(i), "b").rjust(8,"0") for i in s_enc])

但是,无论哪种方式,关键是首先调用 encode() 以将其转换为您选择的编码(从您的问题中不清楚,但在两行之间读取的是 UTF-16)

【讨论】:

  • 也许我在 py3k 进化过程中遗漏了一些东西,但'a'.rjust(2,"0") 不等同于'a'.zfill(2)
  • 是的,我想是的,但我没有意识到 zfill 可以处理任意字符串 - 认为它可能不喜欢十六进制字符 - 文档说“返回 numeric剩下的字符串用零填充......”所以我认为十六进制字符可能会扰乱事情 - 显然不是。所以是的,如果你愿意,你可以在我的例子中使用 zfill(2) 或 zfill(8)。我认为 zfill 的关键在于它可以正确处理负号——我认为这在我的代码中不是问题。
【解决方案2】:

为了获得 unicode codepoint,只需调用ord:

import io
f = io.open("a.txt", mode='r', encoding='utf-8')
for line in f:
    print (line, repr(line), ' '.join(str(ord(c)) for c in line),
                  ' '.join('{0:b}'.format(ord(c)) for c in line))

没有一个unicode 编码。如果您正在寻找代码点的 UTF-16 表示形式(长度可能超过 16 位),只需调用

u'\ufeff\u067e\u0679'.encode('utf-16')

【讨论】:

  • 我想要一个 16 位二进制表示我的 unicode 就像 unicode 'U+0623' 我们有二进制表示 '11011000 10100011'
  • 为什么需要二进制表示?
  • @user1593134 添加了二进制表示。由于 Unicode 跨越超过 100000 > 2¹⁶ 个字符,因此表示不一定是 16 位长。
  • 你不会得到底层 utf-16 数据的实际表示(假设 OP 想要 UTF-16,这还有待澄清),正如你所说, ord() 是给你代码点而不是编码下的实际字节。事实上,对于 7 位 ASCII 范围之外的任何内容,数据看起来都不会像任何标准的 Unicode 表示(至少我认为不会)。
【解决方案3】:
>>> a=u'\ufeff\u067e\u0679'
>>> a
u'\ufeff\u067e\u0679'
>>> a.encode("utf-16")
'\xff\xfe\xff\xfe~\x06y\x06'

最后一行是你想要的字符串。

【讨论】:

  • 如何将此 unicode 转换为 16 位二进制形式。
猜你喜欢
  • 1970-01-01
  • 2021-07-15
  • 2018-09-30
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多