Wenn ich getch () von Flüchen verwendet habe, konnte ich beim Codieren mit UTF-8 kein Japanisch (Mehrbyte-Zeichen) gut empfangen, daher habe ich einen Verarbeitungsteil erstellt.
Wenn Sie beispielsweise 'a' eingeben, wird es in 3 Bytes von 0xe3 0x81 0x82 unterteilt und dreimal eingegeben. Dies ist jedoch unpraktisch. (Was ich wirklich will, ist 0x3042)
Da getch () die Eingabe byteweise betrachtet, kann UTF-8 3 japanische Bytes nicht korrekt empfangen. Also werde ich meinen eigenen UTF-8-Encoder bauen.
Beim ersten Byte ist die Anzahl der Bytes in der Zeichenfolge festgelegt, sodass die bedingte Verzweigung wie folgt durchgeführt wird.
import curses
window = curses.stdscr()
key = window.getch()
#Verarbeitung von Multi-Byte-Zeichen
#Auf Japanisch sind es 3 Bytes, Sie müssen es also zusammenfassen. Schauen Sie sich das erste Byte an
#Da der verbleibende Schraubstock und die Anzahl fest sind, wird der Vorgang ausgeführt.
text_pool = [key]
if 0x00 <= key <= 0x7f:
#1B, damit Sie nichts tun müssen
#ASCII-kompatibler Bereich
pass
elif 0x80 <= key <= 0xbf:
#Dies sollte nach dem zweiten Zeichen sein, also wäre es seltsam, wenn es hereinkäme
print(key)
exit(1)
elif 0xc0 <= key <= 0xdf:
#2B Zeichen mit Umlaut
text_pool.append(self.window.getch())
# text_pool => [0dAAA, 0dBBB]
# 110a aabb 10bb bbbb <=Das ist Text_Inhalt des Pools(Dezimal)
#Nehmen Sie 0b00000aaa bbbbbbbb und char c heraus= (char) (data[i] & 0xff);
#In Dezimalzahl konvertieren und Schlüssel zuweisen
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 Japanisch ist da
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 Ich habe es noch nie gesehen, aber Fehlerbehebung
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:
#Sonderschlüssel
pass
print(chr(key))
Über die Beurteilung des Mausrades https://qiita.com/t4t5u0/items/ae6d25e05b7f7094330e
https://seiai.ed.jp/sys/text/cs/mcodes/ucodeutf8.html
Recommended Posts