Je l'ai écrit parce que je voulais l'aligner verticalement avec la même police de largeur
# -*- coding: utf-8 -*-
def width(s):
return sum([_width(c) for c in s.decode('utf-8')])
def _width(c):
return 2 if _isMultiByte(c) else 1
def _isMultiByte(c):
return ord(c) > 255
assert 0 == width('')
assert 1 == width('a')
assert 1 == width('A')
assert 1 == width('UNE')
assert 1 == width('-')
assert 1 == width('+')
assert 1 == width(' ')
assert 1 == width('\\')
assert 1 == width('\n')
assert 1 == width('\t')
assert 2 == width('aa')
assert 2 == width('AA')
assert 2 == width('Mais')
assert 2 == width('Tsu')
assert 2 == width('Po')
assert 2 == width('je')
assert 2 == width('!')
assert 2 == width('G')
assert 2 == width('UNE')
assert 2 == width('○')
assert 2 == width('■')
assert 2 == width('、')
assert 2 == width('。')
assert 2 == width('‐')
assert 2 == width('-')
assert 2 == width(' ')
assert 2 == width('\\\\')
assert 2 == width('\r\n')
assert 4 == width('YY')
assert 4 == width('0w0')
assert 4 == width('OK!')
Seul ʻA` est étrange ... Il est considéré comme pleine largeur ...
Corrigez uniquement _isMultiByte
# -*- coding: utf-8 -*-
def width(s):
return sum([_width(c) for c in s.decode('utf-8')])
def _width(c):
return 2 if _isMultiByte(c) else 1
def _isMultiByte(c):
import unicodedata
return unicodedata.east_asian_width(c) in ['F', 'W', 'A']
Cette fois, tout va bien! Est-ce que ça a l'air bien?
Je suppose une entrée standard
$echo Howa| python width.py
8
width.py
# -*- coding: utf-8 -*-
import sys
s = sys.stdin.readlines()[0].strip()
print width(s)
Arguments de ligne de commande
$ python width.py howa
8
width.py
# -*- coding: utf-8 -*-
import sys
s = sys.argv[1]
print width(s)
De plus, les caractères grecs et arabes ne sont pas couverts par la garantie de fonctionnement.
Recommended Posts