[FIX] hw_drivers: xlib encoding with keysyms

In KeyboardUSBDriver, we use xlib to translate keysyms. The encoding
of returned chars is now utf-8. We don't need to treat special
characters differently anymore.
This commit is contained in:
Antoine Prieels
2019-09-19 07:44:55 +00:00
parent 37bdade9a2
commit d8a2cf04bd
2 changed files with 1 additions and 780 deletions
@@ -4,7 +4,6 @@
import ctypes
import evdev
import json
from keysym_to_ucs import keysym_mapping
import logging
from lxml import etree
import os
@@ -247,14 +246,7 @@ class KeyboardUSBDriver(Driver):
key_pressed = ctypes.create_string_buffer(5)
xlib.XkbTranslateKeySym(KeyboardUSBDriver.display, ctypes.byref(keysym), 0, ctypes.byref(key_pressed), 5, ctypes.byref(ctypes.c_int()))
if key_pressed.value:
# Latin-1
return key_pressed.value.decode('latin1')
elif (keysym.value & 0xff000000) == 0x01000000:
# Already UCS
return chr(keysym.value & 0x00ffffff)
elif keysym.value in keysym_mapping:
# Other encodings
return chr(keysym_mapping[keysym.value])
return key_pressed.value.decode('utf-8')
return ''
def _get_active_modifiers(self, scancode):
@@ -1,771 +0,0 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
"""
The Keysym -> Character mapping provided by Xlib only supports latin-1
encoded characters. For keysyms corresponding to special characters, X11
won't return anything. This file provides a Keysym to Unicode mapping for
most of the characters not supported by X11.
"""
keysym_mapping = {
0x01a1: 0x0104, # Aogonek Ą
0x01a2: 0x02d8, # breve ˘
0x01a3: 0x0141, # Lstroke Ł
0x01a5: 0x013d, # Lcaron Ľ
0x01a6: 0x015a, # Sacute Ś
0x01a9: 0x0160, # Scaron Š
0x01aa: 0x015e, # Scedilla Ş
0x01ab: 0x0164, # Tcaron Ť
0x01ac: 0x0179, # Zacute Ź
0x01ae: 0x017d, # Zcaron Ž
0x01af: 0x017b, # Zabovedot Ż
0x01b1: 0x0105, # aogonek ą
0x01b2: 0x02db, # ogonek ˛
0x01b3: 0x0142, # lstroke ł
0x01b5: 0x013e, # lcaron ľ
0x01b6: 0x015b, # sacute ś
0x01b7: 0x02c7, # caron ˇ
0x01b9: 0x0161, # scaron š
0x01ba: 0x015f, # scedilla ş
0x01bb: 0x0165, # tcaron ť
0x01bc: 0x017a, # zacute ź
0x01bd: 0x02dd, # doubleacute ˝
0x01be: 0x017e, # zcaron ž
0x01bf: 0x017c, # zabovedot ż
0x01c0: 0x0154, # Racute Ŕ
0x01c3: 0x0102, # Abreve Ă
0x01c5: 0x0139, # Lacute Ĺ
0x01c6: 0x0106, # Cacute Ć
0x01c8: 0x010c, # Ccaron Č
0x01ca: 0x0118, # Eogonek Ę
0x01cc: 0x011a, # Ecaron Ě
0x01cf: 0x010e, # Dcaron Ď
0x01d0: 0x0110, # Dstroke Đ
0x01d1: 0x0143, # Nacute Ń
0x01d2: 0x0147, # Ncaron Ň
0x01d5: 0x0150, # Odoubleacute Ő
0x01d8: 0x0158, # Rcaron Ř
0x01d9: 0x016e, # Uring Ů
0x01db: 0x0170, # Udoubleacute Ű
0x01de: 0x0162, # Tcedilla Ţ
0x01e0: 0x0155, # racute ŕ
0x01e3: 0x0103, # abreve ă
0x01e5: 0x013a, # lacute ĺ
0x01e6: 0x0107, # cacute ć
0x01e8: 0x010d, # ccaron č
0x01ea: 0x0119, # eogonek ę
0x01ec: 0x011b, # ecaron ě
0x01ef: 0x010f, # dcaron ď
0x01f0: 0x0111, # dstroke đ
0x01f1: 0x0144, # nacute ń
0x01f2: 0x0148, # ncaron ň
0x01f5: 0x0151, # odoubleacute ő
0x01f8: 0x0159, # rcaron ř
0x01f9: 0x016f, # uring ů
0x01fb: 0x0171, # udoubleacute ű
0x01fe: 0x0163, # tcedilla ţ
0x01ff: 0x02d9, # abovedot ˙
0x02a1: 0x0126, # Hstroke Ħ
0x02a6: 0x0124, # Hcircumflex Ĥ
0x02a9: 0x0130, # Iabovedot İ
0x02ab: 0x011e, # Gbreve Ğ
0x02ac: 0x0134, # Jcircumflex Ĵ
0x02b1: 0x0127, # hstroke ħ
0x02b6: 0x0125, # hcircumflex ĥ
0x02b9: 0x0131, # idotless ı
0x02bb: 0x011f, # gbreve ğ
0x02bc: 0x0135, # jcircumflex ĵ
0x02c5: 0x010a, # Cabovedot Ċ
0x02c6: 0x0108, # Ccircumflex Ĉ
0x02d5: 0x0120, # Gabovedot Ġ
0x02d8: 0x011c, # Gcircumflex Ĝ
0x02dd: 0x016c, # Ubreve Ŭ
0x02de: 0x015c, # Scircumflex Ŝ
0x02e5: 0x010b, # cabovedot ċ
0x02e6: 0x0109, # ccircumflex ĉ
0x02f5: 0x0121, # gabovedot ġ
0x02f8: 0x011d, # gcircumflex ĝ
0x02fd: 0x016d, # ubreve ŭ
0x02fe: 0x015d, # scircumflex ŝ
0x03a2: 0x0138, # kra ĸ
0x03a3: 0x0156, # Rcedilla Ŗ
0x03a5: 0x0128, # Itilde Ĩ
0x03a6: 0x013b, # Lcedilla Ļ
0x03aa: 0x0112, # Emacron Ē
0x03ab: 0x0122, # Gcedilla Ģ
0x03ac: 0x0166, # Tslash Ŧ
0x03b3: 0x0157, # rcedilla ŗ
0x03b5: 0x0129, # itilde ĩ
0x03b6: 0x013c, # lcedilla ļ
0x03ba: 0x0113, # emacron ē
0x03bb: 0x0123, # gcedilla ģ
0x03bc: 0x0167, # tslash ŧ
0x03bd: 0x014a, # ENG Ŋ
0x03bf: 0x014b, # eng ŋ
0x03c0: 0x0100, # Amacron Ā
0x03c7: 0x012e, # Iogonek Į
0x03cc: 0x0116, # Eabovedot Ė
0x03cf: 0x012a, # Imacron Ī
0x03d1: 0x0145, # Ncedilla Ņ
0x03d2: 0x014c, # Omacron Ō
0x03d3: 0x0136, # Kcedilla Ķ
0x03d9: 0x0172, # Uogonek Ų
0x03dd: 0x0168, # Utilde Ũ
0x03de: 0x016a, # Umacron Ū
0x03e0: 0x0101, # amacron ā
0x03e7: 0x012f, # iogonek į
0x03ec: 0x0117, # eabovedot ė
0x03ef: 0x012b, # imacron ī
0x03f1: 0x0146, # ncedilla ņ
0x03f2: 0x014d, # omacron ō
0x03f3: 0x0137, # kcedilla ķ
0x03f9: 0x0173, # uogonek ų
0x03fd: 0x0169, # utilde ũ
0x03fe: 0x016b, # umacron ū
0x047e: 0x203e, # overline ‾
0x04a1: 0x3002, # kana_fullstop 。
0x04a2: 0x300c, # kana_openingbracket 「
0x04a3: 0x300d, # kana_closingbracket 」
0x04a4: 0x3001, # kana_comma 、
0x04a5: 0x30fb, # kana_conjunctive ・
0x04a6: 0x30f2, # kana_WO ヲ
0x04a7: 0x30a1, # kana_a ァ
0x04a8: 0x30a3, # kana_i ィ
0x04a9: 0x30a5, # kana_u ゥ
0x04aa: 0x30a7, # kana_e ェ
0x04ab: 0x30a9, # kana_o ォ
0x04ac: 0x30e3, # kana_ya ャ
0x04ad: 0x30e5, # kana_yu ュ
0x04ae: 0x30e7, # kana_yo ョ
0x04af: 0x30c3, # kana_tsu ッ
0x04b0: 0x30fc, # prolongedsound ー
0x04b1: 0x30a2, # kana_A ア
0x04b2: 0x30a4, # kana_I イ
0x04b3: 0x30a6, # kana_U ウ
0x04b4: 0x30a8, # kana_E エ
0x04b5: 0x30aa, # kana_O オ
0x04b6: 0x30ab, # kana_KA カ
0x04b7: 0x30ad, # kana_KI キ
0x04b8: 0x30af, # kana_KU ク
0x04b9: 0x30b1, # kana_KE ケ
0x04ba: 0x30b3, # kana_KO コ
0x04bb: 0x30b5, # kana_SA サ
0x04bc: 0x30b7, # kana_SHI シ
0x04bd: 0x30b9, # kana_SU ス
0x04be: 0x30bb, # kana_SE セ
0x04bf: 0x30bd, # kana_SO ソ
0x04c0: 0x30bf, # kana_TA タ
0x04c1: 0x30c1, # kana_CHI チ
0x04c2: 0x30c4, # kana_TSU ツ
0x04c3: 0x30c6, # kana_TE テ
0x04c4: 0x30c8, # kana_TO ト
0x04c5: 0x30ca, # kana_NA ナ
0x04c6: 0x30cb, # kana_NI ニ
0x04c7: 0x30cc, # kana_NU ヌ
0x04c8: 0x30cd, # kana_NE ネ
0x04c9: 0x30ce, # kana_NO ノ
0x04ca: 0x30cf, # kana_HA ハ
0x04cb: 0x30d2, # kana_HI ヒ
0x04cc: 0x30d5, # kana_FU フ
0x04cd: 0x30d8, # kana_HE ヘ
0x04ce: 0x30db, # kana_HO ホ
0x04cf: 0x30de, # kana_MA マ
0x04d0: 0x30df, # kana_MI ミ
0x04d1: 0x30e0, # kana_MU ム
0x04d2: 0x30e1, # kana_ME メ
0x04d3: 0x30e2, # kana_MO モ
0x04d4: 0x30e4, # kana_YA ヤ
0x04d5: 0x30e6, # kana_YU ユ
0x04d6: 0x30e8, # kana_YO ヨ
0x04d7: 0x30e9, # kana_RA ラ
0x04d8: 0x30ea, # kana_RI リ
0x04d9: 0x30eb, # kana_RU ル
0x04da: 0x30ec, # kana_RE レ
0x04db: 0x30ed, # kana_RO ロ
0x04dc: 0x30ef, # kana_WA ワ
0x04dd: 0x30f3, # kana_N ン
0x04de: 0x309b, # voicedsound ゛
0x04df: 0x309c, # semivoicedsound ゜
0x05ac: 0x060c, # Arabic_comma ،
0x05bb: 0x061b, # Arabic_semicolon ؛
0x05bf: 0x061f, # Arabic_question_mark ؟
0x05c1: 0x0621, # Arabic_hamza ء
0x05c2: 0x0622, # Arabic_maddaonalef آ
0x05c3: 0x0623, # Arabic_hamzaonalef أ
0x05c4: 0x0624, # Arabic_hamzaonwaw ؤ
0x05c5: 0x0625, # Arabic_hamzaunderalef إ
0x05c6: 0x0626, # Arabic_hamzaonyeh ئ
0x05c7: 0x0627, # Arabic_alef ا
0x05c8: 0x0628, # Arabic_beh ب
0x05c9: 0x0629, # Arabic_tehmarbuta ة
0x05ca: 0x062a, # Arabic_teh ت
0x05cb: 0x062b, # Arabic_theh ث
0x05cc: 0x062c, # Arabic_jeem ج
0x05cd: 0x062d, # Arabic_hah ح
0x05ce: 0x062e, # Arabic_khah خ
0x05cf: 0x062f, # Arabic_dal د
0x05d0: 0x0630, # Arabic_thal ذ
0x05d1: 0x0631, # Arabic_ra ر
0x05d2: 0x0632, # Arabic_zain ز
0x05d3: 0x0633, # Arabic_seen س
0x05d4: 0x0634, # Arabic_sheen ش
0x05d5: 0x0635, # Arabic_sad ص
0x05d6: 0x0636, # Arabic_dad ض
0x05d7: 0x0637, # Arabic_tah ط
0x05d8: 0x0638, # Arabic_zah ظ
0x05d9: 0x0639, # Arabic_ain ع
0x05da: 0x063a, # Arabic_ghain غ
0x05e0: 0x0640, # Arabic_tatweel ـ
0x05e1: 0x0641, # Arabic_feh ف
0x05e2: 0x0642, # Arabic_qaf ق
0x05e3: 0x0643, # Arabic_kaf ك
0x05e4: 0x0644, # Arabic_lam ل
0x05e5: 0x0645, # Arabic_meem م
0x05e6: 0x0646, # Arabic_noon ن
0x05e7: 0x0647, # Arabic_ha ه
0x05e8: 0x0648, # Arabic_waw و
0x05e9: 0x0649, # Arabic_alefmaksura ى
0x05ea: 0x064a, # Arabic_yeh ي
0x05eb: 0x064b, # Arabic_fathatan ً
0x05ec: 0x064c, # Arabic_dammatan ٌ
0x05ed: 0x064d, # Arabic_kasratan ٍ
0x05ee: 0x064e, # Arabic_fatha َ
0x05ef: 0x064f, # Arabic_damma ُ
0x05f0: 0x0650, # Arabic_kasra ِ
0x05f1: 0x0651, # Arabic_shadda ّ
0x05f2: 0x0652, # Arabic_sukun ْ
0x06a1: 0x0452, # Serbian_dje ђ
0x06a2: 0x0453, # Macedonia_gje ѓ
0x06a3: 0x0451, # Cyrillic_io ё
0x06a4: 0x0454, # Ukrainian_ie є
0x06a5: 0x0455, # Macedonia_dse ѕ
0x06a6: 0x0456, # Ukrainian_i і
0x06a7: 0x0457, # Ukrainian_yi ї
0x06a8: 0x0458, # Cyrillic_je ј
0x06a9: 0x0459, # Cyrillic_lje љ
0x06aa: 0x045a, # Cyrillic_nje њ
0x06ab: 0x045b, # Serbian_tshe ћ
0x06ac: 0x045c, # Macedonia_kje ќ
0x06ae: 0x045e, # Byelorussian_shortu ў
0x06af: 0x045f, # Cyrillic_dzhe џ
0x06b0: 0x2116, # numerosign №
0x06b1: 0x0402, # Serbian_DJE Ђ
0x06b2: 0x0403, # Macedonia_GJE Ѓ
0x06b3: 0x0401, # Cyrillic_IO Ё
0x06b4: 0x0404, # Ukrainian_IE Є
0x06b5: 0x0405, # Macedonia_DSE Ѕ
0x06b6: 0x0406, # Ukrainian_I І
0x06b7: 0x0407, # Ukrainian_YI Ї
0x06b8: 0x0408, # Cyrillic_JE Ј
0x06b9: 0x0409, # Cyrillic_LJE Љ
0x06ba: 0x040a, # Cyrillic_NJE Њ
0x06bb: 0x040b, # Serbian_TSHE Ћ
0x06bc: 0x040c, # Macedonia_KJE Ќ
0x06be: 0x040e, # Byelorussian_SHORTU Ў
0x06bf: 0x040f, # Cyrillic_DZHE Џ
0x06c0: 0x044e, # Cyrillic_yu ю
0x06c1: 0x0430, # Cyrillic_a а
0x06c2: 0x0431, # Cyrillic_be б
0x06c3: 0x0446, # Cyrillic_tse ц
0x06c4: 0x0434, # Cyrillic_de д
0x06c5: 0x0435, # Cyrillic_ie е
0x06c6: 0x0444, # Cyrillic_ef ф
0x06c7: 0x0433, # Cyrillic_ghe г
0x06c8: 0x0445, # Cyrillic_ha х
0x06c9: 0x0438, # Cyrillic_i и
0x06ca: 0x0439, # Cyrillic_shorti й
0x06cb: 0x043a, # Cyrillic_ka к
0x06cc: 0x043b, # Cyrillic_el л
0x06cd: 0x043c, # Cyrillic_em м
0x06ce: 0x043d, # Cyrillic_en н
0x06cf: 0x043e, # Cyrillic_o о
0x06d0: 0x043f, # Cyrillic_pe п
0x06d1: 0x044f, # Cyrillic_ya я
0x06d2: 0x0440, # Cyrillic_er р
0x06d3: 0x0441, # Cyrillic_es с
0x06d4: 0x0442, # Cyrillic_te т
0x06d5: 0x0443, # Cyrillic_u у
0x06d6: 0x0436, # Cyrillic_zhe ж
0x06d7: 0x0432, # Cyrillic_ve в
0x06d8: 0x044c, # Cyrillic_softsign ь
0x06d9: 0x044b, # Cyrillic_yeru ы
0x06da: 0x0437, # Cyrillic_ze з
0x06db: 0x0448, # Cyrillic_sha ш
0x06dc: 0x044d, # Cyrillic_e э
0x06dd: 0x0449, # Cyrillic_shcha щ
0x06de: 0x0447, # Cyrillic_che ч
0x06df: 0x044a, # Cyrillic_hardsign ъ
0x06e0: 0x042e, # Cyrillic_YU Ю
0x06e1: 0x0410, # Cyrillic_A А
0x06e2: 0x0411, # Cyrillic_BE Б
0x06e3: 0x0426, # Cyrillic_TSE Ц
0x06e4: 0x0414, # Cyrillic_DE Д
0x06e5: 0x0415, # Cyrillic_IE Е
0x06e6: 0x0424, # Cyrillic_EF Ф
0x06e7: 0x0413, # Cyrillic_GHE Г
0x06e8: 0x0425, # Cyrillic_HA Х
0x06e9: 0x0418, # Cyrillic_I И
0x06ea: 0x0419, # Cyrillic_SHORTI Й
0x06eb: 0x041a, # Cyrillic_KA К
0x06ec: 0x041b, # Cyrillic_EL Л
0x06ed: 0x041c, # Cyrillic_EM М
0x06ee: 0x041d, # Cyrillic_EN Н
0x06ef: 0x041e, # Cyrillic_O О
0x06f0: 0x041f, # Cyrillic_PE П
0x06f1: 0x042f, # Cyrillic_YA Я
0x06f2: 0x0420, # Cyrillic_ER Р
0x06f3: 0x0421, # Cyrillic_ES С
0x06f4: 0x0422, # Cyrillic_TE Т
0x06f5: 0x0423, # Cyrillic_U У
0x06f6: 0x0416, # Cyrillic_ZHE Ж
0x06f7: 0x0412, # Cyrillic_VE В
0x06f8: 0x042c, # Cyrillic_SOFTSIGN Ь
0x06f9: 0x042b, # Cyrillic_YERU Ы
0x06fa: 0x0417, # Cyrillic_ZE З
0x06fb: 0x0428, # Cyrillic_SHA Ш
0x06fc: 0x042d, # Cyrillic_E Э
0x06fd: 0x0429, # Cyrillic_SHCHA Щ
0x06fe: 0x0427, # Cyrillic_CHE Ч
0x06ff: 0x042a, # Cyrillic_HARDSIGN Ъ
0x07a1: 0x0386, # Greek_ALPHAaccent Ά
0x07a2: 0x0388, # Greek_EPSILONaccent Έ
0x07a3: 0x0389, # Greek_ETAaccent Ή
0x07a4: 0x038a, # Greek_IOTAaccent Ί
0x07a5: 0x03aa, # Greek_IOTAdiaeresis Ϊ
0x07a7: 0x038c, # Greek_OMICRONaccent Ό
0x07a8: 0x038e, # Greek_UPSILONaccent Ύ
0x07a9: 0x03ab, # Greek_UPSILONdieresis Ϋ
0x07ab: 0x038f, # Greek_OMEGAaccent Ώ
0x07ae: 0x0385, # Greek_accentdieresis ΅
0x07af: 0x2015, # Greek_horizbar ―
0x07b1: 0x03ac, # Greek_alphaaccent ά
0x07b2: 0x03ad, # Greek_epsilonaccent έ
0x07b3: 0x03ae, # Greek_etaaccent ή
0x07b4: 0x03af, # Greek_iotaaccent ί
0x07b5: 0x03ca, # Greek_iotadieresis ϊ
0x07b6: 0x0390, # Greek_iotaaccentdieresis ΐ
0x07b7: 0x03cc, # Greek_omicronaccent ό
0x07b8: 0x03cd, # Greek_upsilonaccent ύ
0x07b9: 0x03cb, # Greek_upsilondieresis ϋ
0x07ba: 0x03b0, # Greek_upsilonaccentdieresis ΰ
0x07bb: 0x03ce, # Greek_omegaaccent ώ
0x07c1: 0x0391, # Greek_ALPHA Α
0x07c2: 0x0392, # Greek_BETA Β
0x07c3: 0x0393, # Greek_GAMMA Γ
0x07c4: 0x0394, # Greek_DELTA Δ
0x07c5: 0x0395, # Greek_EPSILON Ε
0x07c6: 0x0396, # Greek_ZETA Ζ
0x07c7: 0x0397, # Greek_ETA Η
0x07c8: 0x0398, # Greek_THETA Θ
0x07c9: 0x0399, # Greek_IOTA Ι
0x07ca: 0x039a, # Greek_KAPPA Κ
0x07cb: 0x039b, # Greek_LAMBDA Λ
0x07cc: 0x039c, # Greek_MU Μ
0x07cd: 0x039d, # Greek_NU Ν
0x07ce: 0x039e, # Greek_XI Ξ
0x07cf: 0x039f, # Greek_OMICRON Ο
0x07d0: 0x03a0, # Greek_PI Π
0x07d1: 0x03a1, # Greek_RHO Ρ
0x07d2: 0x03a3, # Greek_SIGMA Σ
0x07d4: 0x03a4, # Greek_TAU Τ
0x07d5: 0x03a5, # Greek_UPSILON Υ
0x07d6: 0x03a6, # Greek_PHI Φ
0x07d7: 0x03a7, # Greek_CHI Χ
0x07d8: 0x03a8, # Greek_PSI Ψ
0x07d9: 0x03a9, # Greek_OMEGA Ω
0x07e1: 0x03b1, # Greek_alpha α
0x07e2: 0x03b2, # Greek_beta β
0x07e3: 0x03b3, # Greek_gamma γ
0x07e4: 0x03b4, # Greek_delta δ
0x07e5: 0x03b5, # Greek_epsilon ε
0x07e6: 0x03b6, # Greek_zeta ζ
0x07e7: 0x03b7, # Greek_eta η
0x07e8: 0x03b8, # Greek_theta θ
0x07e9: 0x03b9, # Greek_iota ι
0x07ea: 0x03ba, # Greek_kappa κ
0x07eb: 0x03bb, # Greek_lambda λ
0x07ec: 0x03bc, # Greek_mu μ
0x07ed: 0x03bd, # Greek_nu ν
0x07ee: 0x03be, # Greek_xi ξ
0x07ef: 0x03bf, # Greek_omicron ο
0x07f0: 0x03c0, # Greek_pi π
0x07f1: 0x03c1, # Greek_rho ρ
0x07f2: 0x03c3, # Greek_sigma σ
0x07f3: 0x03c2, # Greek_finalsmallsigma ς
0x07f4: 0x03c4, # Greek_tau τ
0x07f5: 0x03c5, # Greek_upsilon υ
0x07f6: 0x03c6, # Greek_phi φ
0x07f7: 0x03c7, # Greek_chi χ
0x07f8: 0x03c8, # Greek_psi ψ
0x07f9: 0x03c9, # Greek_omega ω
0x08a1: 0x23b7, # leftradical ⎷
0x08a2: 0x250c, # topleftradical ┌
0x08a3: 0x2500, # horizconnector ─
0x08a4: 0x2320, # topintegral ⌠
0x08a5: 0x2321, # botintegral ⌡
0x08a6: 0x2502, # vertconnector │
0x08a7: 0x23a1, # topleftsqbracket ⎡
0x08a8: 0x23a3, # botleftsqbracket ⎣
0x08a9: 0x23a4, # toprightsqbracket ⎤
0x08aa: 0x23a6, # botrightsqbracket ⎦
0x08ab: 0x239b, # topleftparens ⎛
0x08ac: 0x239d, # botleftparens ⎝
0x08ad: 0x239e, # toprightparens ⎞
0x08ae: 0x23a0, # botrightparens ⎠
0x08af: 0x23a8, # leftmiddlecurlybrace ⎨
0x08b0: 0x23ac, # rightmiddlecurlybrace ⎬
0x08bc: 0x2264, # lessthanequal ≤
0x08bd: 0x2260, # notequal ≠
0x08be: 0x2265, # greaterthanequal ≥
0x08bf: 0x222b, # integral ∫
0x08c0: 0x2234, # therefore ∴
0x08c1: 0x221d, # variation ∝
0x08c2: 0x221e, # infinity ∞
0x08c5: 0x2207, # nabla ∇
0x08c8: 0x223c, # approximate ∼
0x08c9: 0x2243, # similarequal ≃
0x08cd: 0x21d4, # ifonlyif ⇔
0x08ce: 0x21d2, # implies ⇒
0x08cf: 0x2261, # identical ≡
0x08d6: 0x221a, # radical √
0x08da: 0x2282, # includedin ⊂
0x08db: 0x2283, # includes ⊃
0x08dc: 0x2229, # intersection ∩
0x08dd: 0x222a, # union ∪
0x08de: 0x2227, # logicaland ∧
0x08df: 0x2228, # logicalor ∨
0x08ef: 0x2202, # partialderivative ∂
0x08f6: 0x0192, # function ƒ
0x08fb: 0x2190, # leftarrow ←
0x08fc: 0x2191, # uparrow ↑
0x08fd: 0x2192, # rightarrow →
0x08fe: 0x2193, # downarrow ↓
0x09e0: 0x25c6, # soliddiamond ◆
0x09e1: 0x2592, # checkerboard ▒
0x09e2: 0x2409, # ht ␉
0x09e3: 0x240c, # ff ␌
0x09e4: 0x240d, # cr ␍
0x09e5: 0x240a, # lf ␊
0x09e8: 0x2424, # nl ␤
0x09e9: 0x240b, # vt ␋
0x09ea: 0x2518, # lowrightcorner ┘
0x09eb: 0x2510, # uprightcorner ┐
0x09ec: 0x250c, # upleftcorner ┌
0x09ed: 0x2514, # lowleftcorner └
0x09ee: 0x253c, # crossinglines ┼
0x09ef: 0x23ba, # horizlinescan1 ⎺
0x09f0: 0x23bb, # horizlinescan3 ⎻
0x09f1: 0x2500, # horizlinescan5 ─
0x09f2: 0x23bc, # horizlinescan7 ⎼
0x09f3: 0x23bd, # horizlinescan9 ⎽
0x09f4: 0x251c, # leftt ├
0x09f5: 0x2524, # rightt ┤
0x09f6: 0x2534, # bott ┴
0x09f7: 0x252c, # topt ┬
0x09f8: 0x2502, # vertbar │
0x0aa1: 0x2003, # emspace  
0x0aa2: 0x2002, # enspace  
0x0aa3: 0x2004, # em3space  
0x0aa4: 0x2005, # em4space  
0x0aa5: 0x2007, # digitspace  
0x0aa6: 0x2008, # punctspace  
0x0aa7: 0x2009, # thinspace  
0x0aa8: 0x200a, # hairspace  
0x0aa9: 0x2014, # emdash —
0x0aaa: 0x2013, # endash –
0x0aae: 0x2026, # ellipsis …
0x0aaf: 0x2025, # doubbaselinedot ‥
0x0ab0: 0x2153, # onethird ⅓
0x0ab1: 0x2154, # twothirds ⅔
0x0ab2: 0x2155, # onefifth ⅕
0x0ab3: 0x2156, # twofifths ⅖
0x0ab4: 0x2157, # threefifths ⅗
0x0ab5: 0x2158, # fourfifths ⅘
0x0ab6: 0x2159, # onesixth ⅙
0x0ab7: 0x215a, # fivesixths ⅚
0x0ab8: 0x2105, # careof ℅
0x0abb: 0x2012, # figdash ‒
0x0abc: 0x2329, # leftanglebracket 〈
0x0abe: 0x232a, # rightanglebracket 〉
0x0ac3: 0x215b, # oneeighth ⅛
0x0ac4: 0x215c, # threeeighths ⅜
0x0ac5: 0x215d, # fiveeighths ⅝
0x0ac6: 0x215e, # seveneighths ⅞
0x0ac9: 0x2122, # trademark ™
0x0aca: 0x2613, # signaturemark ☓
0x0acc: 0x25c1, # leftopentriangle ◁
0x0acd: 0x25b7, # rightopentriangle ▷
0x0ace: 0x25cb, # emopencircle ○
0x0acf: 0x25af, # emopenrectangle ▯
0x0ad0: 0x2018, # leftsinglequotemark ‘
0x0ad1: 0x2019, # rightsinglequotemark ’
0x0ad2: 0x201c, # leftdoublequotemark “
0x0ad3: 0x201d, # rightdoublequotemark ”
0x0ad4: 0x211e, # prescription ℞
0x0ad6: 0x2032, # minutes ′
0x0ad7: 0x2033, # seconds ″
0x0ad9: 0x271d, # latincross ✝
0x0adb: 0x25ac, # filledrectbullet ▬
0x0adc: 0x25c0, # filledlefttribullet ◀
0x0add: 0x25b6, # filledrighttribullet ▶
0x0ade: 0x25cf, # emfilledcircle ●
0x0adf: 0x25ae, # emfilledrect ▮
0x0ae0: 0x25e6, # enopencircbullet ◦
0x0ae1: 0x25ab, # enopensquarebullet ▫
0x0ae2: 0x25ad, # openrectbullet ▭
0x0ae3: 0x25b3, # opentribulletup △
0x0ae4: 0x25bd, # opentribulletdown ▽
0x0ae5: 0x2606, # openstar ☆
0x0ae6: 0x2022, # enfilledcircbullet •
0x0ae7: 0x25aa, # enfilledsqbullet ▪
0x0ae8: 0x25b2, # filledtribulletup ▲
0x0ae9: 0x25bc, # filledtribulletdown ▼
0x0aea: 0x261c, # leftpointer ☜
0x0aeb: 0x261e, # rightpointer ☞
0x0aec: 0x2663, # club ♣
0x0aed: 0x2666, # diamond ♦
0x0aee: 0x2665, # heart ♥
0x0af0: 0x2720, # maltesecross ✠
0x0af1: 0x2020, # dagger †
0x0af2: 0x2021, # doubledagger ‡
0x0af3: 0x2713, # checkmark ✓
0x0af4: 0x2717, # ballotcross ✗
0x0af5: 0x266f, # musicalsharp ♯
0x0af6: 0x266d, # musicalflat ♭
0x0af7: 0x2642, # malesymbol ♂
0x0af8: 0x2640, # femalesymbol ♀
0x0af9: 0x260e, # telephone ☎
0x0afa: 0x2315, # telephonerecorder ⌕
0x0afb: 0x2117, # phonographcopyright ℗
0x0afc: 0x2038, # caret ‸
0x0afd: 0x201a, # singlelowquotemark ‚
0x0afe: 0x201e, # doublelowquotemark „
0x0ba3: 0x003c, # leftcaret <
0x0ba6: 0x003e, # rightcaret >
0x0ba8: 0x2228, # downcaret ∨
0x0ba9: 0x2227, # upcaret ∧
0x0bc0: 0x00af, # overbar ¯
0x0bc2: 0x22a5, # downtack ⊥
0x0bc3: 0x2229, # upshoe ∩
0x0bc4: 0x230a, # downstile ⌊
0x0bc6: 0x005f, # underbar _
0x0bca: 0x2218, # jot ∘
0x0bcc: 0x2395, # quad ⎕
0x0bce: 0x22a4, # uptack ⊤
0x0bcf: 0x25cb, # circle ○
0x0bd3: 0x2308, # upstile ⌈
0x0bd6: 0x222a, # downshoe ∪
0x0bd8: 0x2283, # rightshoe ⊃
0x0bda: 0x2282, # leftshoe ⊂
0x0bdc: 0x22a2, # lefttack ⊢
0x0bfc: 0x22a3, # righttack ⊣
0x0cdf: 0x2017, # hebrew_doublelowline ‗
0x0ce0: 0x05d0, # hebrew_aleph א
0x0ce1: 0x05d1, # hebrew_bet ב
0x0ce2: 0x05d2, # hebrew_gimel ג
0x0ce3: 0x05d3, # hebrew_dalet ד
0x0ce4: 0x05d4, # hebrew_he ה
0x0ce5: 0x05d5, # hebrew_waw ו
0x0ce6: 0x05d6, # hebrew_zain ז
0x0ce7: 0x05d7, # hebrew_chet ח
0x0ce8: 0x05d8, # hebrew_tet ט
0x0ce9: 0x05d9, # hebrew_yod י
0x0cea: 0x05da, # hebrew_finalkaph ך
0x0ceb: 0x05db, # hebrew_kaph כ
0x0cec: 0x05dc, # hebrew_lamed ל
0x0ced: 0x05dd, # hebrew_finalmem ם
0x0cee: 0x05de, # hebrew_mem מ
0x0cef: 0x05df, # hebrew_finalnun ן
0x0cf0: 0x05e0, # hebrew_nun נ
0x0cf1: 0x05e1, # hebrew_samech ס
0x0cf2: 0x05e2, # hebrew_ayin ע
0x0cf3: 0x05e3, # hebrew_finalpe ף
0x0cf4: 0x05e4, # hebrew_pe פ
0x0cf5: 0x05e5, # hebrew_finalzade ץ
0x0cf6: 0x05e6, # hebrew_zade צ
0x0cf7: 0x05e7, # hebrew_qoph ק
0x0cf8: 0x05e8, # hebrew_resh ר
0x0cf9: 0x05e9, # hebrew_shin ש
0x0cfa: 0x05ea, # hebrew_taw ת
0x0da1: 0x0e01, # Thai_kokai ก
0x0da2: 0x0e02, # Thai_khokhai ข
0x0da3: 0x0e03, # Thai_khokhuat ฃ
0x0da4: 0x0e04, # Thai_khokhwai ค
0x0da5: 0x0e05, # Thai_khokhon ฅ
0x0da6: 0x0e06, # Thai_khorakhang ฆ
0x0da7: 0x0e07, # Thai_ngongu ง
0x0da8: 0x0e08, # Thai_chochan จ
0x0da9: 0x0e09, # Thai_choching ฉ
0x0daa: 0x0e0a, # Thai_chochang ช
0x0dab: 0x0e0b, # Thai_soso ซ
0x0dac: 0x0e0c, # Thai_chochoe ฌ
0x0dad: 0x0e0d, # Thai_yoying ญ
0x0dae: 0x0e0e, # Thai_dochada ฎ
0x0daf: 0x0e0f, # Thai_topatak ฏ
0x0db0: 0x0e10, # Thai_thothan ฐ
0x0db1: 0x0e11, # Thai_thonangmontho ฑ
0x0db2: 0x0e12, # Thai_thophuthao ฒ
0x0db3: 0x0e13, # Thai_nonen ณ
0x0db4: 0x0e14, # Thai_dodek ด
0x0db5: 0x0e15, # Thai_totao ต
0x0db6: 0x0e16, # Thai_thothung ถ
0x0db7: 0x0e17, # Thai_thothahan ท
0x0db8: 0x0e18, # Thai_thothong ธ
0x0db9: 0x0e19, # Thai_nonu น
0x0dba: 0x0e1a, # Thai_bobaimai บ
0x0dbb: 0x0e1b, # Thai_popla ป
0x0dbc: 0x0e1c, # Thai_phophung ผ
0x0dbd: 0x0e1d, # Thai_fofa ฝ
0x0dbe: 0x0e1e, # Thai_phophan พ
0x0dbf: 0x0e1f, # Thai_fofan ฟ
0x0dc0: 0x0e20, # Thai_phosamphao ภ
0x0dc1: 0x0e21, # Thai_moma ม
0x0dc2: 0x0e22, # Thai_yoyak ย
0x0dc3: 0x0e23, # Thai_rorua ร
0x0dc4: 0x0e24, # Thai_ru ฤ
0x0dc5: 0x0e25, # Thai_loling ล
0x0dc6: 0x0e26, # Thai_lu ฦ
0x0dc7: 0x0e27, # Thai_wowaen ว
0x0dc8: 0x0e28, # Thai_sosala ศ
0x0dc9: 0x0e29, # Thai_sorusi ษ
0x0dca: 0x0e2a, # Thai_sosua ส
0x0dcb: 0x0e2b, # Thai_hohip ห
0x0dcc: 0x0e2c, # Thai_lochula ฬ
0x0dcd: 0x0e2d, # Thai_oang อ
0x0dce: 0x0e2e, # Thai_honokhuk ฮ
0x0dcf: 0x0e2f, # Thai_paiyannoi ฯ
0x0dd0: 0x0e30, # Thai_saraa ะ
0x0dd1: 0x0e31, # Thai_maihanakat ั
0x0dd2: 0x0e32, # Thai_saraaa า
0x0dd3: 0x0e33, # Thai_saraam ำ
0x0dd4: 0x0e34, # Thai_sarai ิ
0x0dd5: 0x0e35, # Thai_saraii ี
0x0dd6: 0x0e36, # Thai_saraue ึ
0x0dd7: 0x0e37, # Thai_sarauee ื
0x0dd8: 0x0e38, # Thai_sarau ุ
0x0dd9: 0x0e39, # Thai_sarauu ู
0x0dda: 0x0e3a, # Thai_phinthu ฺ
0x0ddf: 0x0e3f, # Thai_baht ฿
0x0de0: 0x0e40, # Thai_sarae เ
0x0de1: 0x0e41, # Thai_saraae แ
0x0de2: 0x0e42, # Thai_sarao โ
0x0de3: 0x0e43, # Thai_saraaimaimuan ใ
0x0de4: 0x0e44, # Thai_saraaimaimalai ไ
0x0de5: 0x0e45, # Thai_lakkhangyao ๅ
0x0de6: 0x0e46, # Thai_maiyamok ๆ
0x0de7: 0x0e47, # Thai_maitaikhu ็
0x0de8: 0x0e48, # Thai_maiek ่
0x0de9: 0x0e49, # Thai_maitho ้
0x0dea: 0x0e4a, # Thai_maitri ๊
0x0deb: 0x0e4b, # Thai_maichattawa ๋
0x0dec: 0x0e4c, # Thai_thanthakhat ์
0x0ded: 0x0e4d, # Thai_nikhahit ํ
0x0df0: 0x0e50, # Thai_leksun ๐
0x0df1: 0x0e51, # Thai_leknung ๑
0x0df2: 0x0e52, # Thai_leksong ๒
0x0df3: 0x0e53, # Thai_leksam ๓
0x0df4: 0x0e54, # Thai_leksi ๔
0x0df5: 0x0e55, # Thai_lekha ๕
0x0df6: 0x0e56, # Thai_lekhok ๖
0x0df7: 0x0e57, # Thai_lekchet ๗
0x0df8: 0x0e58, # Thai_lekpaet ๘
0x0df9: 0x0e59, # Thai_lekkao ๙
0x0ea1: 0x3131, # Hangul_Kiyeog ㄱ
0x0ea2: 0x3132, # Hangul_SsangKiyeog ㄲ
0x0ea3: 0x3133, # Hangul_KiyeogSios ㄳ
0x0ea4: 0x3134, # Hangul_Nieun ㄴ
0x0ea5: 0x3135, # Hangul_NieunJieuj ㄵ
0x0ea6: 0x3136, # Hangul_NieunHieuh ㄶ
0x0ea7: 0x3137, # Hangul_Dikeud ㄷ
0x0ea8: 0x3138, # Hangul_SsangDikeud ㄸ
0x0ea9: 0x3139, # Hangul_Rieul ㄹ
0x0eaa: 0x313a, # Hangul_RieulKiyeog ㄺ
0x0eab: 0x313b, # Hangul_RieulMieum ㄻ
0x0eac: 0x313c, # Hangul_RieulPieub ㄼ
0x0ead: 0x313d, # Hangul_RieulSios ㄽ
0x0eae: 0x313e, # Hangul_RieulTieut ㄾ
0x0eaf: 0x313f, # Hangul_RieulPhieuf ㄿ
0x0eb0: 0x3140, # Hangul_RieulHieuh ㅀ
0x0eb1: 0x3141, # Hangul_Mieum ㅁ
0x0eb2: 0x3142, # Hangul_Pieub ㅂ
0x0eb3: 0x3143, # Hangul_SsangPieub ㅃ
0x0eb4: 0x3144, # Hangul_PieubSios ㅄ
0x0eb5: 0x3145, # Hangul_Sios ㅅ
0x0eb6: 0x3146, # Hangul_SsangSios ㅆ
0x0eb7: 0x3147, # Hangul_Ieung ㅇ
0x0eb8: 0x3148, # Hangul_Jieuj ㅈ
0x0eb9: 0x3149, # Hangul_SsangJieuj ㅉ
0x0eba: 0x314a, # Hangul_Cieuc ㅊ
0x0ebb: 0x314b, # Hangul_Khieuq ㅋ
0x0ebc: 0x314c, # Hangul_Tieut ㅌ
0x0ebd: 0x314d, # Hangul_Phieuf ㅍ
0x0ebe: 0x314e, # Hangul_Hieuh ㅎ
0x0ebf: 0x314f, # Hangul_A ㅏ
0x0ec0: 0x3150, # Hangul_AE ㅐ
0x0ec1: 0x3151, # Hangul_YA ㅑ
0x0ec2: 0x3152, # Hangul_YAE ㅒ
0x0ec3: 0x3153, # Hangul_EO ㅓ
0x0ec4: 0x3154, # Hangul_E ㅔ
0x0ec5: 0x3155, # Hangul_YEO ㅕ
0x0ec6: 0x3156, # Hangul_YE ㅖ
0x0ec7: 0x3157, # Hangul_O ㅗ
0x0ec8: 0x3158, # Hangul_WA ㅘ
0x0ec9: 0x3159, # Hangul_WAE ㅙ
0x0eca: 0x315a, # Hangul_OE ㅚ
0x0ecb: 0x315b, # Hangul_YO ㅛ
0x0ecc: 0x315c, # Hangul_U ㅜ
0x0ecd: 0x315d, # Hangul_WEO ㅝ
0x0ece: 0x315e, # Hangul_WE ㅞ
0x0ecf: 0x315f, # Hangul_WI ㅟ
0x0ed0: 0x3160, # Hangul_YU ㅠ
0x0ed1: 0x3161, # Hangul_EU ㅡ
0x0ed2: 0x3162, # Hangul_YI ㅢ
0x0ed3: 0x3163, # Hangul_I ㅣ
0x0ed4: 0x11a8, # Hangul_J_Kiyeog ᆨ
0x0ed5: 0x11a9, # Hangul_J_SsangKiyeog ᆩ
0x0ed6: 0x11aa, # Hangul_J_KiyeogSios ᆪ
0x0ed7: 0x11ab, # Hangul_J_Nieun ᆫ
0x0ed8: 0x11ac, # Hangul_J_NieunJieuj ᆬ
0x0ed9: 0x11ad, # Hangul_J_NieunHieuh ᆭ
0x0eda: 0x11ae, # Hangul_J_Dikeud ᆮ
0x0edb: 0x11af, # Hangul_J_Rieul ᆯ
0x0edc: 0x11b0, # Hangul_J_RieulKiyeog ᆰ
0x0edd: 0x11b1, # Hangul_J_RieulMieum ᆱ
0x0ede: 0x11b2, # Hangul_J_RieulPieub ᆲ
0x0edf: 0x11b3, # Hangul_J_RieulSios ᆳ
0x0ee0: 0x11b4, # Hangul_J_RieulTieut ᆴ
0x0ee1: 0x11b5, # Hangul_J_RieulPhieuf ᆵ
0x0ee2: 0x11b6, # Hangul_J_RieulHieuh ᆶ
0x0ee3: 0x11b7, # Hangul_J_Mieum ᆷ
0x0ee4: 0x11b8, # Hangul_J_Pieub ᆸ
0x0ee5: 0x11b9, # Hangul_J_PieubSios ᆹ
0x0ee6: 0x11ba, # Hangul_J_Sios ᆺ
0x0ee7: 0x11bb, # Hangul_J_SsangSios ᆻ
0x0ee8: 0x11bc, # Hangul_J_Ieung ᆼ
0x0ee9: 0x11bd, # Hangul_J_Jieuj ᆽ
0x0eea: 0x11be, # Hangul_J_Cieuc ᆾ
0x0eeb: 0x11bf, # Hangul_J_Khieuq ᆿ
0x0eec: 0x11c0, # Hangul_J_Tieut ᇀ
0x0eed: 0x11c1, # Hangul_J_Phieuf ᇁ
0x0eee: 0x11c2, # Hangul_J_Hieuh ᇂ
0x0eef: 0x316d, # Hangul_RieulYeorinHieuh ㅭ
0x0ef0: 0x3171, # Hangul_SunkyeongeumMieum ㅱ
0x0ef1: 0x3178, # Hangul_SunkyeongeumPieub ㅸ
0x0ef2: 0x317f, # Hangul_PanSios ㅿ
0x0ef3: 0x3181, # Hangul_KkogjiDalrinIeung ㆁ
0x0ef4: 0x3184, # Hangul_SunkyeongeumPhieuf ㆄ
0x0ef5: 0x3186, # Hangul_YeorinHieuh ㆆ
0x0ef6: 0x318d, # Hangul_AraeA ㆍ
0x0ef7: 0x318e, # Hangul_AraeAE ㆎ
0x0ef8: 0x11eb, # Hangul_J_PanSios ᇫ
0x0ef9: 0x11f0, # Hangul_J_KkogjiDalrinIeung ᇰ
0x0efa: 0x11f9, # Hangul_J_YeorinHieuh ᇹ
0x0eff: 0x20a9, # Korean_Won ₩
0x13a4: 0x20ac, # Euro €
0x13bc: 0x0152, # OE Œ
0x13bd: 0x0153, # oe œ
0x13be: 0x0178, # Ydiaeresis Ÿ
0x20ac: 0x20ac, # EuroSign €
}