Wie man mit Python-Flüchen Japanisch eingibt

Umgebung

Einführung

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.

Symptome

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)

Ursache

Da getch () die Eingabe byteweise betrachtet, kann UTF-8 3 japanische Bytes nicht korrekt empfangen. Also werde ich meinen eigenen UTF-8-Encoder bauen.

Lösung

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

Beziehung

Über die Beurteilung des Mausrades https://qiita.com/t4t5u0/items/ae6d25e05b7f7094330e

Referenz

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

Recommended Posts

Wie man mit Python-Flüchen Japanisch eingibt
So zeigen Sie Python-Japanisch mit Lolipop an
[Python] Umgang mit japanischen Zeichen mit openCV
Wie man mit Python-Flüchen ein Urteil über das Mausrad erhält
Erste Schritte mit Python
So berechnen Sie das Datum mit Python
Umgang mit Japanisch mit Python
So arbeiten Sie mit BigQuery in Python
Verwendung von Japanisch mit NLTK-Plot
So installieren Sie Python3 mit Docker Centos
Wie man Japanern nicht entgeht, wenn man mit json in Python umgeht
So installieren Sie Python
Hochladen mit Heroku, Flask, Python, Git (4)
Wie man Spaß am Programmieren mit Minecraft hat (Ruby, Python)
[REAPER] Wie man Reascript mit Python spielt
So führen Sie eine Mehrkern-Parallelverarbeitung mit Python durch
So beschneiden Sie ein Bild mit Python + OpenCV
So messen Sie die Ausführungszeit mit Python Teil 1
Wie man tkinter mit Python in Pyenv benutzt
[Python] Vergleichen von Datum und Uhrzeit mit der hinzugefügten Zeitzone
So messen Sie die Ausführungszeit mit Python Part 2
Stellen Sie mit Python eine Verbindung zu BigQuery her
So konvertieren / wiederherstellen Sie einen String mit [] in Python
Senden Sie japanische Post mit Python3
So installieren Sie Python [Windows]
python3: Verwendung der Flasche (2)
So kratzen Sie Bilddaten von Flickr mit Python
So führen Sie eine Hash-Berechnung mit Salt in Python durch
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Stellen Sie mit Python eine Verbindung zu Wikipedia her
So aktualisieren Sie Pythons Tkinter auf 8.6
Post to Slack mit Python 3
Hochladen mit Heroku, Flask, Python, Git (Teil 3)
So führen Sie Tests zusammen mit Python unittest aus
[Python] So legen Sie den Download-Speicherort mit youtube-dl fest
So messen Sie die Wiedergabezeit von MP3-Dateien mit Python
Verwendung des interaktiven Python-Modus mit Git Bash
Wie benutzt man Python Argparse?
Wie aktualisiere ich mit SQLAlchemy?
Es ist zu mühsam, Japanisch in Vims Python3 anzuzeigen.
Wie man mit Theano besetzt
Hochladen mit Heroku, Flask, Python, Git (Teil 1)
[Python] Umgang mit Pandas read_html Lesefehler
[Python] Verwendung von checkio
Japanische morphologische Analyse mit Python
So führen Sie Notepad ++ Python aus
Hochladen mit Heroku, Flask, Python, Git (Teil 2)
Wie mit SQLAlchemy ändern?
Schalten Sie Python mit Alternativen auf 2.7 um
Schreiben Sie mit Python in csv
So trennen Sie Zeichenfolgen mit ','
So ändern Sie die Python-Version
[Python] So schreiben Sie den Tabellenstil mit python-pptx um [python-pptx]
Wie man RDP auf Fedora31 macht
[Python] So erstellen Sie mit Matplotlib ein zweidimensionales Histogramm
Wie man in Python entwickelt
[Python] Wie man Skalar beurteilt
[Python] Verwendung von input ()