【问题标题】:Python: Replace character by its Unicode-representationPython:用它的Unicode表示替换字符
【发布时间】:2014-05-05 20:50:22
【问题描述】:

如何用 Unicode 表示替换字符串中的所有字符?

小例子:

>>> s = 'ä'
>>> new = some_function(s, 'unicode')
>>> new
'\u00E4'

【问题讨论】:

  • 这不是 UTF-8 表示,而是 Unicode 表示。您需要了解其中的区别。
  • @Mark:对不起,我弄混了。
  • 另一个问题,这是 Python 2 还是 Python 3?他们处理字符串文字的方式有所不同。在 Python 2 中,您将获得一个与程序编码相同的字节字符串,但在 Python 3 中,您将获得一个 Unicode 字符串。

标签: python string replace utf-8


【解决方案1】:

不确定您所说的“unicode 表示”是什么意思。 这是我对您问题的解释的解决方案。

对于 Python 3:

print('\\u' + hex(ord('ä'))[2:].upper().rjust(4, '0'))

对于 Python 2:

print('\\u' + repr(u'ä')[4:-1].upper().rjust(4, '0'))

【讨论】:

  • 谢谢,它适用于所有非 ascii 字符。将你的和 Mark 的结合成功了。
【解决方案2】:

第一步是从字节字符串转换为Unicode字符串:

u = s.decode('utf-8')

第二步是创建一个新字符串,其中每个字符都替换为其 Unicode 转义序列。

new = ''.join('\\u{:04x}'.format(ord(c)) for c in u)

如果您的意图只是替换非 ASCII 字符,那么稍作修改即可:

new = ''.join(c if 32 <= ord(c) < 128 else '\\u{:04x}'.format(ord(c)) for c in u)

请注意,\u0000 表示法仅适用于基本 Unicode 平面中的 Unicode 代码点。对于更大的内容,您需要 \U00000000 符号。您也可以使用\x00 表示小于 256 的任何值。以下处理所有情况,可能更容易阅读:

def unicode_notation(c):
    x = ord(c)
    if 32 <= x < 128:
        return c
    if x < 256:
        return '\\x{:02x}'.format(x)
    if x < 0x10000:
        return '\\u{:04x}'.format(x)
    return '\\U{:08x}'.format(x)

new = ''.join(unicode_notation(c) for c in u)

【讨论】:

  • 修改 Valentin 的解决方案(→ new = ''.join([i if 32
  • @CFP 我认为format 比所有的文本操作都干净一些,但这完全是风格问题,所以无论什么适合你。请记住我对大于 0x10000 的字符的警告。
【解决方案3】:

我想这就是你想要的?

>>> new = s.decode('utf-8')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2018-04-19
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多