【问题标题】:Special characters are printed only as a part of string, but not independently (python3)特殊字符仅作为字符串的一部分打印,但不独立打印(python3)
【发布时间】:2019-06-11 16:37:48
【问题描述】:

我使用包含变音符号的字符串。当我打印字符串时,它打印正确:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s = "ˈtau̯rum"
print(s)
> ˈtau̯rum

但是,当我遍历字符串并独立打印每个字符时,某些字符不会打印:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
s = "ˈtau̯rum"
for c in s:

    print (c)

>
ˈ
t
a
u

r
u
m

【问题讨论】:

  • 这是一个组合字符。除非 结合 与前面的字符,否则它可能对您的终端没有任何意义。从外观上看,您的终端已经对它进行了奇怪的处理。
  • 我不太关心终端打印的输出,但我怎样才能确保这些字符在内部正确表示,例如当我在我的程序中操作这些字符串时?

标签: python-3.x utf-8 utf


【解决方案1】:

您可以使用此代码:

import unicodedata
s = "ˈtau̯rum" 

a = ""
for c in s:
    if unicodedata.combining(c):
        a += c
    else:
        print(a)
        a = c
else:
    print(a)

以这种方式,您正在组合组合字符。您可以将print(a) 替换为必须保持在一起的代码点列表存储。

【讨论】:

    【解决方案2】:

    正如评论所建议的,打印问题很可能是由于您的终端处理显示 unicode 字符的方式。您可以通过将字符编码为 utf-8 字节或使用内置的 ord() 来检查字符是否符合您的预期。

    给定一个表示一个 Unicode 字符的字符串,返回一个表示该字符的 Unicode 代码点的整数。例如,ord('a') 返回整数 97,ord('€')(欧元符号)返回 8364。这是 chr() 的倒数。

    例如

    Python 3.7.1 (default, Oct 23 2018, 19:19:42)
    Type 'copyright', 'credits' or 'license' for more information
    IPython 7.1.1 -- An enhanced Interactive Python. Type '?' for help.
    
    IIn [1]: s = "ˈtau̯rum"                                                                                                 
    
    In [2]: print(s)
    ˈtau̯rum
    
    In [3]: for c in s:
       ...:     print(c, c.encode('utf-8'), ord(c))
       ...:
    ˈ b'\xcb\x88' 712
    t b't' 116
    a b'a' 97
    u b'u' 117
    ̯  b'\xcc\xaf' 815
    r b'r' 114
    u b'u' 117
    m b'm' 109
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2017-02-10
      • 2014-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多