Was ist dieses Zeichen: '*'?

48

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 unipropsauf 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, unipropsweiß 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.


unipropsist ein hübsches kleines Skript, das im Unicode::TusslePerl-Modul enthalten ist und Informationen zu dem Zeichen ausgibt, das Sie ihm geben.

terdon
quelle
Kann nicht reproduzieren. Ich habe ord("*")für Ihre eingefügte Zeichenfolge und den nativen *Schlüssel dieselbe Nummer für beide verwendet (42).
16. März,
7
@MarchHo verdammt, die SE-Engine scheint es zu essen. Ich habe es vor dem Posten getestet und konnte das seltsame Zeichen kopieren (obwohl ich allmählich verstehe, dass das Problem darin besteht, dass zusätzliche, nicht druckbare Zeichen hinzugefügt wurden), aber ich kann es auch nicht von der geposteten Frage kopieren. Sie müssen auf den Bearbeitungslink klicken und von dort kopieren.
Terdon
2
Seltsamerweise wird in der Android-App die Null mit Leerzeichen so angezeigt, als wäre es ein normales Leerzeichen.
Derobert
1
Interessanterweise wird es beim Einfügen von "Bearbeiten" in mein Terminal urxvtbereits als angezeigt *<200b>.
Bodo
Wenn Sie es aus Ihrem Codeabschnitt, z. B. der uniprops-Zeile, kopieren, wird OK kopiert, ohne dass Sie zur Fragenquelle wechseln müssen. (Einfügen in Python3-Interpreter zeigt '*\u200b'auch)
TessellatingHeckler

Antworten:

71

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:

stro=u"'*​'?"
def uniconv(text):
    return " ".join(hex(ord(char)) for char in text)
uniconv(stro)

Die Funktion uniconvkonvertiert die Eingabezeichenfolge (in diesem Fall u"'*'?") in ihre Unicode-Codepage-Entsprechungen im Hexadezimalformat. Das uPräfix der Zeichenfolge kennzeichnet die Zeichenfolge als Unicode-Zeichenfolge.

Ich konnte die Ausgabe erhalten:

0x27 0x2a 0x200b 0x27 0x3f

Das können wir deutlich sehen 0x27, 0x2aund 0x3fsind die ASCII / Unicode hexadezimalen Werte für die Zeichen ', *und ?jeweils. Das lässt 0x200balso 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.

March Ho
quelle
5
Durch Ersetzen strdurch hexwerden die Codepunkte hexadezimal ausgegeben, sodass sie leichter erkannt oder nachgeschlagen werden können.
Deltab
Es gibt auch ein spezielles Python-Modul unicodedata, mit dem Sie Charakternamen, Kategorien usw. abfragen können.
bodo
4
Die Zeichen ZERO WIDTH SPACE und ZERO WIDTH JOINER sind praktisch für Kommentarsysteme, die versuchen, gängige Spam-Begriffe zu blockieren. Wenn Sie beispielsweise darauf hinweisen möchten, dass Bernie Sanders als Sozialistin in den Senat gewählt wurde (ohne eine Spamfalle für "Cialis" auszulösen), geben Sie "Sozialliste" ein, wenn HTML-Entitäten beachtet werden, oder fügen Sie das Zeichen aus der Zeichentabelle ein oder gleichwertig, wenn nicht.
Monty Harder
27

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:

$ printf '*​' | od -c
0000000   * 342 200 213
0000004

Das 342 200 213ist eine oktale Darstellung eines anderen Charakters und wir können diese Seite benutzen , um es nachzuschlagen:

Character                   ​               
Character name                              ZERO WIDTH SPACE
Hex code point                              200B
Decimal code point                          8203
Hex UTF-8 bytes                             E2 80 8B
Octal UTF-8 bytes                           342 200 213
UTF-8 bytes as Latin-1 characters bytes     â <80> <8B>

Was ich also tatsächlich hatte, waren zwei Unicode-Zeichen, das normale *und ein Leerzeichen mit der Breite Null.

terdon
quelle
6
Ein anderer Weg, das zu tun, ist printf '\342\200\213' | uniname. (uniname ist aus dem uniutils-Paket.)
Deltaab
1
Von dieser Seite aus können Sie verschiedene Formate konvertieren: für HEX gibt es 002A 200B, für utf-8 2A E2 80 8Bfür utf-16 002A 200B...
Hastur