Ein Freund fügte einen Befehl in einen Slack- Chatraum ein, der den Charakter enthielt *
. Das sieht normal aus *
, ist aber nicht:
$ uniprops '*'
uniprops: no character named ‹*›
Wenn ich uniprops
auf dem Sternchen laufe, das ich beim Tippen auf meinem Computer erhalte, erhalte ich:
$ uniprops '*'
U+002A ‹*› \N{ASTERISK}
\pP \p{Po}
All Any ASCII Assigned Basic_Latin Punct Is_Punctuation Common Zyyy Po P
Gr_Base Grapheme_Base Graph X_POSIX_Graph GrBase Other_Punctuation
Pat_Syn Pattern_Syntax PatSyn POSIX_Graph POSIX_Print POSIX_Punct Print
X_POSIX_Print Punctuation Unicode X_POSIX_Punct
Ich kann auch erkennen, dass es sich nicht um ein tatsächliches Sternchen handelt, indem ich es durchführe od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Während der normale gibt:
$ printf '*' | od -c
0000000 *
0000001
Hier ist der mysteriöse Charakter etwas größer:
*
Und das normale Sternchen (ja, sie sehen identisch aus):
*
Also, uniprops
weiß nicht, was das ist, und ich kann es auch nicht auf http://www.fileformat.info/ finden . Ich weiß, dass der Freund, der es eingefügt hat, unter OS X läuft (ich bin unter Linux) und dass es auf ihrem System als regulärer Stern funktioniert. Ich gehe davon aus, dass Slack es irgendwie geändert hat. Hat jemand eine Ahnung, was dieser Charakter ist?
Beachten Sie, dass Sie das seltsame Zeichen nicht direkt aus der Frage kopieren können. Anscheinend entfernt das Stack Exchange-Modul die nachfolgenden nicht druckbaren Zeichen. Klicken Sie auf den Link "Bearbeiten" und kopieren Sie ihn stattdessen von dort.
uniprops
ist ein hübsches kleines Skript, das im Unicode::Tussle
Perl-Modul enthalten ist und Informationen zu dem Zeichen ausgibt, das Sie ihm geben.
quelle
ord("*")
für Ihre eingefügte Zeichenfolge und den nativen*
Schlüssel dieselbe Nummer für beide verwendet (42).urxvt
bereits als angezeigt*<200b>
.'*\u200b'
auch)Antworten:
Das Einfügen schlug nicht wegen des Sternchens fehl, das ein ganz normales Sternchen ist, sondern wegen des Unicode-Zeichens U + 200B . Da das Zeichen a ist
ZERO WIDTH SPACE
, wird es beim Kopieren nicht angezeigt.Verwenden des Python-Codes:
Die Funktion
uniconv
konvertiert die Eingabezeichenfolge (in diesem Fallu"'*'?"
) in ihre Unicode-Codepage-Entsprechungen im Hexadezimalformat. Dasu
Präfix der Zeichenfolge kennzeichnet die Zeichenfolge als Unicode-Zeichenfolge.Ich konnte die Ausgabe erhalten:
Das können wir deutlich sehen
0x27
,0x2a
und0x3f
sind die ASCII / Unicode hexadezimalen Werte für die Zeichen'
,*
und?
jeweils. Das lässt0x200b
also den Charakter erkennen.Beachten Sie, dass beim Einfügen des Python-Codes in den Body das U + 200B-Zeichen von der Markdown-Software von SE entfernt wurde. Um das erwartete Ergebnis zu erhalten, müssen Sie es über die Bearbeitungsansicht direkt aus dem Titel kopieren.
quelle
str
durchhex
werden die Codepunkte hexadezimal ausgegeben, sodass sie leichter erkannt oder nachgeschlagen werden können.unicodedata
, mit dem Sie Charakternamen, Kategorien usw. abfragen können.Mit Hilfe von @Rinzwind im Chatroom von Ask Ubuntu habe ich herausgefunden, dass das Problem überhaupt nicht der Charakter ist. Beachten Sie die Ausgabe von
od
:Das
342 200 213
ist eine oktale Darstellung eines anderen Charakters und wir können diese Seite benutzen , um es nachzuschlagen:Was ich also tatsächlich hatte, waren zwei Unicode-Zeichen, das normale
*
und ein Leerzeichen mit der Breite Null.quelle
printf '\342\200\213' | uniname
. (uniname ist aus dem uniutils-Paket.)002A 200B
, für utf-82A E2 80 8B
für utf-16002A 200B
...