Python3 如何檢查字符長度?

jacklam 发布于 2013/02/24 17:07
阅读 1K+
收藏 1

是這樣的,我用len檢查英文字串和中文字串雖然字數是一樣的,但實際列印出來中文比英文佔更多位

所以顯示中文時會有些字出了界面,變得非常不美觀,請問可以怎解決?


加载中
1
deleted
deleted
这个是字体字宽问题, 和语言毫无关系
0
路小磊
路小磊
可以先转换为byte然后再计算长度吧?Python3默认用unicode编码,导致中英文占位数不同。
路小磊
路小磊
回复 @SkyLothar : 说的不完整。我意思是unicode的utf8实现方式,对不同范围的字符使用不同长度的编码
SkyLothar
SkyLothar
unicode会让中英文占byte数不同?胡扯。。。
0
jacklam
jacklam
明白了,非常感謝你的回答!!
0
jacklam
jacklam

引用来自“loolly”的答案

可以先转换为byte然后再计算长度吧?Python3默认用unicode编码,导致中英文占位数不同。

自己寫的函數不能正常工作, 可以可以再幫我一次??

thank!!

def split(string, end): 
	rec = ""
	count  = 0
	string = string.strip( ) 
	for str in string.split('\n'): 
		if len(str.encode()) >= end:
			for s in str: 
				count += len(s.encode())
				if count > end: 
					rec = rec + '\n' + s
					count = 1
				else: 
					rec = rec + s
		else: 
			rec = rec + str + '\n' 
	return rec


text1 = string.ascii_uppercase * 20
text = '隕石墜落之處引發猛烈爆炸,同時產生強烈氣流,震碎多棟建築物的窗戶,更有工廠的幾千呎屋頂塌下,而大多數人是被震碎的玻璃割傷,暫未有報告顯示有人被殞石碎片直接擊' 
	
spliter(text1, 26)
Result:

ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
ABCDEFGHIJKLMNOPQRSTUVWXYZ
 


spliter(text, 26) 
Result: 


隕石墜落之處引發
猛烈爆炸,同時產生
強烈氣流,震碎多棟
建築物的窗戶,更有
工廠的幾千呎屋頂塌
下,而大多數人是被
震碎的玻璃割傷,暫
未有報告顯示有人被
殞石碎片直接擊
還是不對稱性
0
SkyLothar
SkyLothar

楼主你贴的代码是给人看的么。。不用要tab缩进好么。。spliter又是什么鬼东西

0
jacklam
jacklam

我用curses劃了個28*80的界面去顯示字串,那怎麼解決字体寛問題呢?


0
路小磊
路小磊

不还意思,你说的是字符对齐问题,理解错了。

关于字符对齐,我觉得你可以把英文字符拆分,添加两个空格试下。

0
Yisen
Yisen
一个英文字符占一个位置,一个中文字占两个位置
0
jacklam
jacklam
這我知道所以我寫了個函去解決這問題但字串中如果有中文和英文可能會出現超奇怪問題
另外上面貼的代碼可能有排版問題,現在再貼多次大家研究下吧

def spliter(string, end): 
    rec = ""
    count  = 0
    string = string.strip( ) 
    for str in string.split('\n'): 
        if len(str.encode()) >= end:
            for s in str: 
                if len(s.encode()) == 3: 
                    count += len(s.encode()) / 1.5
                else: 
                    count += len(s.encode())

                if count > end: 
                    rec = rec + '\n' + s
                    count = 0
                else: 
                    rec = rec + s
        else: 
            rec = rec + str + '\n' 
    return rec

0
jacklam
jacklam

引用来自“YiseNet”的答案

一个英文字符占一个位置,一个中文字占两个位置
不錯的提議,我嘗試下吧
返回顶部
顶部