Comment entrer le japonais avec les malédictions Python

environnement

introduction

Quand j'ai utilisé getch () des malédictions, je ne pouvais pas bien recevoir le japonais (caractères multi-octets) lors de l'encodage avec UTF-8, donc j'ai fait une partie de traitement.

Symptômes

Par exemple, si vous tapez «a», il sera divisé en 3 octets de 0xe3 0x81 0x82 et sera entré 3 fois. Cependant, cela n'est pas pratique. (Ce que je veux vraiment, c'est 0x3042)

Cause

Puisque getch () regarde l'octet d'entrée par octet, UTF-8 ne peut pas recevoir correctement 3 octets de japonais. Donc, je vais créer mon propre encodeur UTF-8.

Solution

En regardant le premier octet, le nombre d'octets dans la chaîne de caractères est fixe, donc le branchement conditionnel est effectué comme suit.

import curses

window = curses.stdscr()
key = window.getch()

#Traitement des caractères multi-octets
#En japonais, c'est 3 octets, vous devez donc le regrouper. Regardez le premier octet
#Étant donné que l'étau et le nombre restants sont fixes, le processus est effectué.
text_pool = [key]
if 0x00 <= key <= 0x7f:
     #1B pour que vous n'ayez rien à faire
     #zone compatible ascii
     pass
elif 0x80 <= key <= 0xbf:
     #Cela devrait être après le deuxième caractère, il serait donc étrange qu'il entre
     print(key)
     exit(1)
elif 0xc0 <= key <= 0xdf:
     #2B caractères avec tréma
     text_pool.append(self.window.getch())
     # text_pool => [0dAAA, 0dBBB]
     # 110a aabb 10bb bbbb <=C'est du texte_Contenu de la piscine(Décimal)
     #Sortir 0b00000aaa bbbbbbbb et char c= (char) (data[i] & 0xff);
     #Convertir en nombre décimal et attribuer à la clé
     a, b = text_pool
     tmp = map(lambda x: bin(x)[2:], [0b00011111 & a, 0b00111111 & b])
     tmp = ''.join(item.zfill(6) for item in tmp)
     key = int(tmp,2)
elif 0xe0 <= key <= 0xef:
     #3B Japanese est là
     for _ in range(2):
         text_pool.append(self.window.getch())
         a, b, c = text_pool
         # 0b 1110xxxx 10xxyyyy 10yyyyyy
         # 0d a        b        c
         tmp = map(lambda x: bin(x)[2:], [0b00001111 & a, 0b00111111 & b, 0b00111111 & c])
         tmp = ''.join([item.zfill(6) for item in tmp])
         key = int(tmp,2)
elif 0xf0 <= key <= 0xff:
#4B Je ne l'ai jamais vu, mais correction de bugs
     for _ in range(3):
         text_pool.append(self.window.getch())
         a, b, c ,d = text_pool
         # 11110xxx 10xxyyyy 10yyyyzz 10zzzzzz
         tmp = map(lambda x: bin(x)[2:], [0b00000111 & a, 0b00111111 & b, 0b00111111 & c, 0b00111111 & d])
         tmp = ''.join([item.zfill(6) for item in tmp])
         key = int(tmp,2)
else:
    #Clé spéciale
    pass


print(chr(key))

Relation

À propos du jugement de la molette de la souris https://qiita.com/t4t5u0/items/ae6d25e05b7f7094330e

référence

https://seiai.ed.jp/sys/text/cs/mcodes/ucodeutf8.html

Recommended Posts

Comment entrer le japonais avec les malédictions Python
Comment afficher le japonais python avec lolipop
[Python] Comment gérer les caractères japonais avec openCV
Comment obtenir le verdict de la molette de la souris avec des malédictions Python
Comment démarrer avec Python
Comment calculer la date avec python
Comment gérer le japonais avec Python
Comment utiliser BigQuery en Python
Comment utiliser le japonais avec le tracé NLTK
Comment installer python3 avec docker centos
Comment ne pas échapper au japonais en traitant avec JSON en Python
Comment installer Python
Comment télécharger avec Heroku, Flask, Python, Git (4)
Comment profiter de la programmation avec Minecraft (Ruby, Python)
[REAPER] Comment jouer à Reascript avec Python
Comment faire un traitement parallèle multicœur avec python
Comment recadrer une image avec Python + OpenCV
Comment mesurer le temps d'exécution avec Python Partie 1
Comment utiliser tkinter avec python dans pyenv
[Python] Comment comparer la date / heure avec le fuseau horaire ajouté
Comment mesurer le temps d'exécution avec Python, partie 2
Connectez-vous à BigQuery avec Python
Comment convertir / restaurer une chaîne avec [] en python
Envoyer du courrier japonais avec Python3
Comment installer Python [Windows]
python3: Comment utiliser la bouteille (2)
Comment récupérer des données d'image de Flickr avec Python
Comment faire un calcul de hachage avec Salt en Python
[Introduction à Python] Comment itérer avec la fonction range?
Connectez-vous à Wikipedia avec Python
Comment mettre à jour Tkinter de Python vers la version 8.6
Publiez sur Slack avec Python 3
Comment télécharger avec Heroku, Flask, Python, Git (Partie 3)
Comment exécuter des tests avec Python unittest
[Python] Comment spécifier l'emplacement de téléchargement avec youtube-dl
Comment mesurer le temps de lecture d'un fichier mp3 avec python
Comment utiliser le mode interactif python avec git bash
Comment utiliser Python Argparse
Comment mettre à jour avec SQLAlchemy?
Il est trop difficile d'afficher le japonais avec le python3 de Vim.
Comment lancer avec Theano
Comment télécharger avec Heroku, Flask, Python, Git (Partie 1)
[Python] Comment gérer l'erreur de lecture pandas read_html
[Python] Comment utiliser checkio
Analyse morphologique japonaise avec Python
Comment exécuter Notepad ++ Python
Comment télécharger avec Heroku, Flask, Python, Git (Partie 2)
Comment modifier avec SQLAlchemy?
Basculer python vers 2.7 avec des alternatives
Écrire en csv avec Python
Comment séparer les chaînes avec ','
Comment changer la version de Python
[Python] Comment réécrire le style de table avec python-pptx [python-pptx]
Comment faire RDP sur Fedora31
[Python] Comment créer un histogramme bidimensionnel avec Matplotlib
Comment développer en Python
[python] Comment juger scalaire
[Python] Comment utiliser input ()