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.
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)
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.
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))
À propos du jugement de la molette de la souris https://qiita.com/t4t5u0/items/ae6d25e05b7f7094330e
https://seiai.ed.jp/sys/text/cs/mcodes/ucodeutf8.html
Recommended Posts