Преобразование unicode-представления числа в строку ascii

Я искал простой способ преобразования числа из строки unicode в строку ascii в python. Например, ввод:

input = u'\u0663\u0669\u0668\u066b\u0664\u0667' 

Должна давать '398.47' .

Я начал с:

 NUMERALS_TRANSLATION_TABLE = {0x660:ord("0"), 0x661:ord("1"), 0x662:ord("2"), 0x663:ord("3"), 0x664:ord("4"), 0x665:ord("5"), 0x666:ord("6"), 0x667:ord("7"), 0x668:ord("8"), 0x669:ord("9"), 0x66b:ord(".")} input.translate(NUMERALS_TRANSLATION_TABLE) 

Это решение сработало, но я хочу иметь возможность поддерживать все символы, связанные с номерами, в юникоде, а не только на арабском. Я могу перевести цифры, перейдя строку unicode и запустив unicodedata.digit(input[i]) для каждого символа. Мне не нравится это решение, потому что оно не решает '\u066b' или '\u2013' . Я мог бы решить их, используя translate как резерв, но я не уверен, есть ли другие такие персонажи, о которых я в настоящее время не знаю, и поэтому я пытаюсь найти лучшее, более элегантное решение.

Любые предложения будут ценны.

Использование unicodedata.digit() для поиска значений цифр для числовых кодов – это правильный метод:

 >>> import unicodedata >>> unicodedata.digit(u'\u0663') 3 

Это использует стандартную информацию Unicode для поиска числовых значений для заданного кода.

Вы можете построить таблицу переводов, используя str.isdigit() для проверки цифр; это верно для всех кодовых точек, для которых стандарт определяет числовое значение. Для десятичных точек вы можете искать DECIMAL SEPARATOR в названии; стандарт не отслеживает их отдельно по любой другой метрике:

 NUMERALS_TRANSLATION_TABLE = { i: unicode(unicodedata.digit(unichr(i))) for i in range(2 ** 16) if unichr(i).isdigit()} NUMERALS_TRANSLATION_TABLE.update( (i, u'.') for i in range(2 ** 16) if 'DECIMAL SEPARATOR' in unicodedata.name(unichr(i), '')) 

Это создает таблицу из 447 записей, в том числе 2 десятичных точки в UAB 066b ARABIC DECIMAL SEPARATOR и U + 2396 DECIMAL SEPARATOR KEY SYMBOL ; последний на самом деле является просто составленным символом, чтобы наклеить десятичный разделительный ключ на цифровой клавиатуре, где производитель не хочет брать на себя печать или . десятичный разделитель на этом ключе.

Демо-версия:

 >>> import unicodedata >>> NUMERALS_TRANSLATION_TABLE = { ... i: unicode(unicodedata.digit(unichr(i))) ... for i in range(2 ** 16) if unichr(i).isdigit()} >>> NUMERALS_TRANSLATION_TABLE.update( ... (i, u'.') for i in range(2 ** 16) ... if 'DECIMAL SEPARATOR' in unicodedata.name(unichr(i), '')) >>> input = u'\u0663\u0669\u0668\u066b\u0664\u0667' >>> input.translate(NUMERALS_TRANSLATION_TABLE) '398.47' 
 >>> from unidecode import unidecode >>> unidecode(u'\u0663\u0669\u0668\u066b\u0664\u0667') '398.47'