首页 > 解决方案 > 使用python3查找表情符号的宽度

问题描述

我尝试使用 python 中的模式打印字母“A”

def printA(length,height,symbol):
    a = [[" " for i in range(length)] for i in range(height)]
    for i in range(height):
        for j in range(length):
            if j == 0 or i == 0 or i == height // 2 or j == length - 1:a[i][j] = symbol
    return a

它适用于普通字符,例如*,/+,-,#,$,% .. etc.,

输出:普通字符

#######
#     #
#     #
#######
#     #
#     #
#     #

表情符号


     
     

     
     
     

如果我能找到表情符号的长度,那么我将能够将空格更改为表情符号的长度,这样就不会出现这个问题,有什么办法可以做到这一点

注意:上面的代码只适用于字符而不是字符串

编辑:
根据snakecharmerb的回答,它仅用于打印字符A,但是当我尝试A多次打印ie的序列时,它只是放错了表情符号

示例:我尝试打印AAAAA

输出 :

从上面的输出中,当我们增加字母的位置时,它会自行重新定位,有什么方法可以防止这种情况发生

我打印了AAAAA这样的

a = printA(7,7,"")
for i in a:
    for k in range(5):print(*(i),end="  ")
    print()

标签: pythonpython-3.xunicodeemoji

解决方案


重要的是显示字符的字体中字形的宽度,而不是作为 Python 字符串的字符长度。Python 无法获得此信息,但我们可以根据unicodedata模块报告的 unicode 标准所定义的是否symbol广泛的东亚字符来猜测。

import unicodedata 


def printA(length, height, symbol):  
    # Two spaces for "wide" characters, one space for others.
    spacer = '  ' if unicodedata.east_asian_width(symbol) == 'W' else ' ' 
    a = [[spacer for i in range(length)] for i in range(height)]  
    for i in range(height): 
        for j in range(length): 
            if j == 0 or i == 0 or i == height // 2 or j == length - 1:
                a[i][j] = symbol  
    return a

使用东亚宽度属性有效,因为

表情符号字符最初是通过使用传统东亚编码的扩展来开发的,例如 Shift-JIS,在这种情况下,它们被视为宽字符。虽然这些扩展已被添加到 Unicode 或映射到标准化的变体序列,但它们作为宽字符的处理已被保留,并被扩展以与缺乏传统编码的表情符号字符保持一致。

链接

您可能还需要检查您的终端是否使用等宽字体。

另请参阅此问答,了解有关在终端中将文本与不同字符宽度属性对齐的一些问题,以及thisthis


推荐阅读