位置: 编程技术 - 正文

Python计算字符宽度的方法(python计算字符串长度的程序)

编辑:rootadmin

推荐整理分享Python计算字符宽度的方法(python计算字符串长度的程序),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python中计算字符串长度的函数,python字符宽度,python计算字符长度,python中计算字符串长度的函数,python中如何计算字符串长度,python字符宽度,python求字符串长度的函数,python计算字符长度,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了Python计算字符宽度的方法。分享给大家供大家参考,具体如下:

最近在用python写一个CLI小程序,其中涉及到计算字符宽度,目标是以友好的方式将一个长字符串截取为等宽的片段。

对于unicode字符,python的len函数可以准确的计算其中所包含的字符个数,但是个数并不代表宽度,如:

因此无法简单的使用这种方式来计算宽度。

GBK decode

首先我想到GBK编码,?7F范围内的字符是一字节编码,其余是双字节编码,正好与字符的宽度大体一致,于是有了这样的投机取巧的办法(假设取8个宽度):

如代码所示,首先将unicode的字符串进行GBK编码,然后截取8个字节的宽度后尝试用GBK解码,若解码失败,则少截取一个宽度,截取7个字节后使用GBK解码。

虽然初步解决了问题,但是这样做的硬伤很明显。首先代码不优雅,以试错的方式运行;其次GBK所能表示的字符有限,对于大量GBK编码以外的字符无法支持。

East_Asian_Width

Python计算字符宽度的方法(python计算字符串长度的程序)

徘徊很久之后,偶然发现 Unicode Character Database 标准中有East_Asian_Width 属性,并有以下可能值:

其中除A不确定外,F/H/N/Na/W都能很明确的知道宽度,如果保守起见,将A视为宽度为2的话,则很容易给出单个字符的宽度:

到现在似乎已经可以满足要求了,但是实际使用中发现属性为A的字符真不少见,最典型的就是中文的双引号:

在大多数等宽字体中,中文双引号都是只占一位宽的,如果一行里有多个中文双引号,则累加的误判宽度将会使截取效果大打折扣,无疑这也不是最好的办法。

urwid的解决方案

urwid 是一个成熟的python终端UI库,它在curses的基础之上包装了类似HTML的控件用以显示文本内容,如果有这方面的开发需求,非常推荐此库,比直接使用curses库方便很多,非常棒的是它对unicode的文本宽度截取非常准确,让我大为惊讶,于是翻开它的源码一探究竟,文本宽度计算方面其核心代码如下:

如代码所示,首先根据unicode的官方EastAsianWidth 文档整理出字符宽度的范围表,然后使用unicode代码查表。使用之前的例子测试:

完全准确,而且在实际应用中的表现也比较好,是一个理想的解决方案,更多技巧请查阅urwid的old_str_util.py 源码。

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python模块包中__init__.py文件功能分析 本文实例讲述了Python模块包中__init__.py文件功能。分享给大家供大家参考,具体如下:用django做开发已经一年多的时间,但基本没注意python模块中__init__.

Python中getattr函数和hasattr函数作用详解 hasattr(object,name)作用:判断对象object是否包含名为name的特性(hasattr是通过调用getattr(ojbect,name)是否抛出异常来实现的)。示例:hasattr(list,'append')Truehasatt

浅析Python中的getattr(),setattr(),delattr(),hasattr() getattr()函数是Python自省的核心函数,具体使用大体如下:获取对象引用getattrGetattr用于返回一个对象属性,或者方法classA:def__init__(self):self.name='zhangjing'#s

标签: python计算字符串长度的程序

本文链接地址:https://www.jiuchutong.com/biancheng/387625.html 转载请保留说明!

上一篇:Python中文分词实现方法(安装pymmseg)(python中文分词库)

下一篇:Python模块包中__init__.py文件功能分析(python 包 __init__)

  • 从香港向境外汇款怎么汇
  • 取得投资款属于什么过程
  • 银行借记和贷记的区别是什么
  • 应收账款贷方有余额是什么意思
  • 机票的抵扣进项怎么抵扣
  • 卖废品开发票开什么货物名称
  • 工资没走公账走的私人账户合法吗
  • 同一控制下企业合并报表编制
  • 企业所得税可以不交吗
  • 政府补贴中介合法吗
  • 应纳税所得额就是企业所得税吗
  • 税控服务费能抵扣吗
  • 存货换入无形资产考虑增值税
  • 卖股票为什么要留一手
  • 旅行社代订机票怎么做账
  • 预缴两个点的税是什么意思
  • 最新土地增值税实施细则
  • 批发led电子屏
  • 股东其他应付款可以转为实收资本文本格式
  • 一般纳税人增值税及附加税费申报表怎么填
  • 进项票税率不同怎么处理
  • 存货清查的账务处理的阐述
  • 增值税月末如何计算
  • 双倍余额法折旧率计算公式
  • 腾讯手游助手如何隐藏鼠标
  • 腾讯手游助手卡顿严重
  • 留存收益在哪里可以查到
  • 结转到生产成本的科目
  • 关闭固定在任务栏的功能
  • 股权折价转让
  • php occ
  • 分配结转制造费用时借方科目
  • 成本结转的科目
  • 解决的英文
  • 发行的企业债券是什么会计科目
  • 来料加工企业需注意什么
  • 自产自销的苗木免税吗
  • 邓弗里斯什么水平
  • mmdetection ValueError: need at least one array to concatenate解决方案
  • 投资公司取得的发票
  • 帝国cms数据表
  • phpcms使用教程
  • 织梦使用教程
  • 其他应收款如何平账
  • 一般纳税人资格证明在哪里查询
  • 商业承兑汇票贴现率
  • sqlserver存储过程写法
  • PostgreSQL教程(二十):PL/pgSQL过程语言
  • 可供出售金融资产名词解释
  • 海关被税没有发票
  • 应收账款结算方式有几种
  • 管理费用不可以税前抵扣的利润表怎么填写
  • 代扣代缴的个人所得税在现金流量表
  • 非流动资产减少
  • 影响以前年度损益的科目
  • 盘盈的固定资产怎么处理
  • 建筑业营改增后税务问题
  • 公司注销往来账要消吗
  • sqlserver存储过程返回多个结果集
  • win10预览版21277下载
  • win8系统怎么直接进入桌面
  • win10系统开机蓝屏得重启后才能开机
  • cleanmymac3激活码领取
  • win8创建系统映像
  • 关于我和鬼变成家人的那件事
  • 浅谈jquery中ajax跨域提交的时候会有2次请求的问题
  • java timer
  • socket pf_inet
  • android点击按钮弹出对话框
  • winrar指令
  • 批处理安装
  • js的调试
  • 设计模式含义
  • jQuery+ajax实现滚动到页面底部自动加载图文列表效果(类似图片懒加载)
  • 江西省国家税务局电子税务局
  • 未按时缴纳税款是什么行为
  • 海南省地方税务局关于土地增值税清算有关问题的通知
  • 建筑工程施工企业资质
  • 遵从和尊重
  • 城市维护建设税的计税依据
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设