Warum ist '' ↊'.nnumerisch () `false?

Nach dem offiziellen Unicode-Konsortium-Code-Diagramm sind alle diese numerisch:

⅐ ⅑ ⅒ ⅓ ⅔ ⅕ ⅖ ⅗ ⅘ ⅙ ⅚ ⅛ ⅜ ⅝ ⅞ ⅟ Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ Ⅸ Ⅹ Ⅺ Ⅻ Ⅼ Ⅽ Ⅾ Ⅿ ⅰ ⅱ ⅲ ⅳ ⅴ ⅵ ⅶ ⅷ ⅸ ⅹ ⅺ ⅻ ⅼ ⅽ ⅾ ⅿ ↀ ↁ ↂ Ↄ ↄ ↅ ↆ ↇ ↈ ↉ ↊ ↋ 

Allerdings, wenn ich fragen, Python zu sagen, welche sind numerisch, sie alle sind (auch ) außer vier:

 In [252]: print([k for k in "⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉↊↋" if not k.isnumeric()]) ['Ↄ', 'ↄ', '↊', '↋'] 

Diese sind:

  • Ↄ römische Ziffer umgekehrt hundert
  • Ↄ lateinischer kleiner Buchstabe umgekehrt C
  • ↊ Drehen Digit Zwei
  • ↋ Drehen Sie die Ziffer drei

Warum betrachtet Python diese nicht numerisch?

One Solution collect form web for “Warum ist '' ↊'.nnumerisch () `false?”

str.isnumeric ist dokumentiert, um für "alle Zeichen, die die Unicode-numerische Wert-Eigenschaft haben"

Die kanonische Referenz für diese Eigenschaft ist die Unicode-Zeichendatenbank . Die Informationen, die wir benötigen, können aus http://www.unicode.org/Public/9.0.0/ucd/UnicodeData.txt ausgegraben werden, was die neueste Version zum Zeitpunkt des Schreibens ist (Ende 2016) (Warnung: 1.5MB Text Datei). Es ist ein wenig knifflig zu lesen (die Dokumentation ist in UAX # 44 ). Ich werde seinen Eintrag für einen Charakter zeigen, der zuerst numerisch ist, U + 3023 HANGZHOU NUMERAL DREI ( )

 3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; 

Das achte Semikolon-getrennte Feld ist die Eigenschaft "numerischer Wert"; In diesem Fall ist sein Wert 3, im Einklang mit dem Namen des Charakters. Python's str.isnumeric ist wahr, wenn und nur wenn dieses Feld nicht leer ist. Es kann direkt mit unicodedata.numeric abgefragt werden.

Das dritte Semikolon-getrennte Feld ist ein Zwei-Zeichen-Code, der die " allgemeine Kategorie " gibt; In diesem Fall "Nl". Die meisten, aber nicht alle, der Zeichen mit einem numerischen Wert sind in einer der "Zahl" Kategorien (erster Buchstabe des Kategoriencodes ist ein N). Die Ausnahmen sind alle hanzi, die je nach Kontext eine Zahl bedeuten können oder nicht; Siehe UAX # 38 .

Nun, die Charaktere, die du fragst:

 2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L ;;;;;N;;; ;2184; 2184;LATIN SMALL LETTER REVERSED C ;Ll;0;L ;;;;;N;;;2183; ;2183 218A;TURNED DIGIT TWO ;So;0;ON;;;;;N;;; ; ; 218B;TURNED DIGIT THREE ;So;0;ON;;;;;N;;; ; ; 

Diese Zeichen haben keinen numerischen Wert zugewiesen, so dass Pythons Verhalten korrekt ist – wie-dokumentiert.

Anmerkung: pro https://docs.python.org/3.6/whatsnew/3.6.html wird Python nur auf Unicode 9.0.0 in der Version 3.6 aktualisiert; AFAICT diese Charaktere haben sich aber nicht längst verändert.

("Warum haben diese Charaktere keinen numerischen Wert?" Ist eine Frage, die nur das Unicode-Konsortium endgültig beantworten kann, wenn Sie interessiert sind, schlage ich vor, es auf eine ihrer Mailinglisten zu bringen .)

  • Parsing UTF-8 / Unicode-Strings mit lxml HTML
  • Python os.stat und Unicode-Dateinamen
  • Python __str__ versus __unicode__
  • Python-Regex nicht mit einem bestimmten Unicode> 2 Hex-Werte übereinstimmen
  • Unicode-Arabisch-String zum Benutzer
  • Konvertieren von Unicode-Zeichenfolge in chinesische Zeichen
  • Unicode zu PHP exec
  • UnicodeEncodeError auf Linux aber nicht auf Windows
  • Python: Wie kann ich Schriftzeichen mit voller Breite durch halbe Zeichen ersetzen?
  • Match Unicode in Ply's Regexes
  • Python list () -Funktion, die in (ich glaube) utf-8 ändere
  • Python ist die beste Programmiersprache der Welt.