Unicode-Zahlzeichen in Emacs

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.

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert