In John Cooks Blogpost geht es darum, welche Unicode-Zeichen als Zahlen interpretierbar sind. Zum Beispiel steckt hinter den Zeichen „2” und „Ⅱ” eine Zahl. Im Beitrag wird Python verwendet, um der Sache auf den Grund zu gehen. Wie sieht es in Emacs aus?
Die Elisp-Funktion string-to-number
wandelt Zeichenketten in Zahlen um. Dabei muss die Zeichenkette aus den üblichen Dezimalziffern bestehen.
(setq result nil)
(dolist (codepoint (number-sequence 1 #x10ffff))
(if (not (equal 0 (string-to-number (make-string 1 codepoint))))
(push (make-string 1 codepoint) result) )
)
result
Das Ergebnis sind die Zeichen | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | .
Die Funktion describe-char
gibt einem die Einzelheiten zum Zeichen, auf dem der Cursor gerade liegt. Für die römische Zwei sieht das so aus:
position: 1072 of 1116 (96%), column: 52
character: Ⅱ (displayed as Ⅱ) (codepoint 8545, #o20541, #x2161)
charset: unicode (Unicode (ISO10646))
code point in charset: 0x2161
script: symbol
syntax: w which means: word
category: .:Base, G:2-byte Greek, L:Left-to-right (strong), c:Chinese, h:Korean, j:Japanese
to input: type "C-x 8 RET 2161" or "C-x 8 RET ROMAN NUMERAL TWO"
buffer code: #xE2 #x85 #xA1
file code: #xE2 #x85 #xA1 (encoded by coding system utf-8-unix)
display: by this font (glyph code)
ftcrhb:-PfEd-Linux Libertine Display O-normal-normal-normal-*-32-*-*-*-*-0-iso10646-1 (#x67C)
Character code properties: customize what to show
name: ROMAN NUMERAL TWO
general-category: Nl (Number, Letter)
decomposition: (compat 73 73) (compat 'I' 'I')
numeric-value: 2
There are text properties here:
fontified t
Den „numeric-value” des Zeichens kann man auch mittels get-char-code-property
ermitteln, so dass man sich alle Zeichen mit einem numerischem Wert herausgeben lassen kann:
(setq result nil)
(dolist (codepoint (number-sequence 1 #x10ffff))
(if (get-char-code-property codepoint 'numeric-value)
(push codepoint result))
)
(length result)
Anscheinend ist das bei 1826 Zeichen der Fall. Alternativ kann man sich die Zeichen herausgeben lassen, deren General Category einer Zahlkategorie entspricht:
(setq result nil)
(dolist (codepoint (number-sequence 1 #x10ffff))
(if
(let ((category (get-char-code-property codepoint 'general-category) ))
(or (string= category "No") (string= category "Nl") (string= category "Nd")))
(push codepoint result)
)
)
(length result)
Das sind nicht ganz so viele, nämlich nur 1781.