Découvrez la largeur apparente d'une chaîne en python

Je l'ai écrit parce que je voulais l'aligner verticalement avec la même police de largeur

Essayez le jugement pleine largeur avec le code de caractère

# -*- 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

Contrôle de fonctionnement

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 ...

[Largeur de l'Asie de l'Est](https://ja.wikipedia.org/wiki/%E6%9D%B1%E3%82%A2%E3%82%B8%E3%82%A2%E3%81%AE%E6 % 96% 87% E5% AD% 97% E5% B9% 85)

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?

Supplément

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

Découvrez la largeur apparente d'une chaîne en python
Python --Trouvez le nombre de groupes dans l'expression regex
Trouver les valeurs propres d'une vraie matrice symétrique en Python
[Python] Programmation pour trouver le nombre de a dans une chaîne de caractères qui se répète un nombre spécifié de fois.
Récupérer l'appelant d'une fonction en Python
Copiez la liste en Python
Trouvez le nombre de jours dans un mois
Découvrez la fraction de la valeur saisie en python
Trouvez la solution de l'équation d'ordre n avec python
Sortie sous la forme d'un tableau python
[Python] Trouvez la matrice de translocation en notation d'inclusion
Sortie d'une courte chaîne de caractères de type URL en Python
Trouver des erreurs en Python
Vérifiez si la chaîne est un nombre en python
Connaissez l'emplacement du fichier de définition de classe Python.
Découpez une partie de la chaîne à l'aide d'une tranche Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Maya | Découvrez le nombre de polygones dans l'objet sélectionné
Obtenez le nombre d'éléments spécifiques dans la liste python
[Note] Importation de fichiers dans le répertoire parent en Python
Découvrez le nombre maximum de caractères dans un texte multiligne stocké dans un bloc de données
J'ai utilisé Python pour découvrir les choix de rôle des 51 "Yachts" dans le monde.
Découvrez combien de chaque caractère est dans la chaîne.
Créer une chaîne aléatoire en Python
Comment compter rapidement la fréquence d'apparition des caractères à partir d'une chaîne de caractères en Python?
Spécifiez le codage de la chaîne Unicode dans l'instruction d'impression Python 2.x
Créer une instance d'une classe prédéfinie à partir d'une chaîne en Python
Comment déterminer l'existence d'un élément sélénium en Python
Comment vérifier la taille de la mémoire d'une variable en Python
Lire la sortie standard d'un sous-processus ligne par ligne en Python
Comment vérifier la taille de la mémoire d'un dictionnaire en Python
Une fonction qui mesure le temps de traitement d'une méthode en python
Trouvez le rang de la matrice dans le monde XOR (rang de la matrice sur F2)
Obtenez la formule dans le fichier Excel sous forme de chaîne en Python
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Conversion de la chaîne <-> date (date, datetime) en Python
Vérifiez le comportement du destroyer en Python
Ecrire le test dans la docstring python
Afficher une liste d'alphabets en Python 3
Exécuter l'interpréteur Python dans le script
Le résultat de l'installation de python sur Anaconda
[python] [meta] Le type de python est-il un type?
Principes de base pour exécuter NoxPlayer en Python
Générer une classe à partir d'une chaîne en Python
À la recherche du FizzBuzz le plus rapide en Python
L'histoire du traitement A du blackjack (python)
Mémorandum du processus de suppression de chaîne python
J'ai essayé de trouver la différence entre A + = B et A = A + B en Python, alors notez
Python VBA pour obtenir une capture de la page WEB entière avec Selenium
Si vous voulez un singleton en python, considérez le module comme un singleton
Vérifions la chaîne d'octets en mémoire du nombre flottant flottant en Python
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux colorer une partie de la chaîne Excel avec Python
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Fonction Eval () qui calcule une chaîne de caractères comme expression en python
Découvrez le nom de la méthode qui l'a appelée à partir de la méthode qui est python
[Introduction à Python] Une explication approfondie des types de chaînes de caractères utilisés dans Python!
Obtenez une instance datetime à tout moment de la journée en Python