Ich habe es geschrieben, weil ich es vertikal mit der gleichen Schriftbreite ausrichten wollte
# -*- 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('EIN')
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('Aber')
assert 2 == width('Tsu')
assert 2 == width('Po')
assert 2 == width('ich')
assert 2 == width('!')
assert 2 == width('G')
assert 2 == width('EIN')
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!')
Nur A
ist seltsam ... Es wird als in voller Breite beurteilt ...
Korrigieren Sie nur "_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']
Diesmal ist alles in Ordnung! Sieht das gut aus
Ich gehe von einer Standardeingabe aus
$Echo Howa| python width.py
8
width.py
# -*- coding: utf-8 -*-
import sys
s = sys.stdin.readlines()[0].strip()
print width(s)
Kommandozeilenargumente
$ python width.py howa
8
width.py
# -*- coding: utf-8 -*-
import sys
s = sys.argv[1]
print width(s)
Griechische und arabische Zeichen fallen nicht unter die Betriebsgarantie.
Recommended Posts