python - 使用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()
解决方案
重要的是显示字符的字体中字形的宽度,而不是作为 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 或映射到标准化的变体序列,但它们作为宽字符的处理已被保留,并被扩展以与缺乏传统编码的表情符号字符保持一致。
(链接)
您可能还需要检查您的终端是否使用等宽字体。
推荐阅读
- excel - 复制 Excel RANK 公式而不更改结束引用
- css - 引导布局:嵌套在 div 内的 Img 不会对齐左边缘
- pdf - 文本更改为图形,在 PDF 中仍然可以选择?
- regex - 提取tableau中的第一行文本
- amazon-web-services - AWS 通过 IP 和 Mac 组合阻止?
- json - 如何使用正文中的外部数据通过 JSON 向 API 发出 PUT 请求?
- c++ - 给定以下一段代码,“cout”操作执行了多少次
- c# - WPF DataGrid - 如何在按钮单击时使选定的行可编辑
- javascript - 如何在 js 中为 twitch api 添加 OAuth 令牌
- reactjs - React 状态随机更改为值 1