Bu karakter nedir: '*'?


48

Bir arkadaş , karakteri içeren bir Slack sohbet odasına bir komut yapıştırdı *. Bu normal gibi görünüyor *ama değil:

$ uniprops '*​'
uniprops: no character named ‹*​›

Makineme unipropsyazarken yıldızla koşarsam alıyorum:

$ 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

Ayrıca geçerek gerçek bir yıldız işareti olmadığını da görebiliyorum od:

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

Normal olanı verirken:

$ printf '*' | od -c
0000000   *
0000001

İşte gizemli karakter biraz daha büyük:

*

Ve normal yıldız işareti (evet, aynı görünüyorlar):

*

Yani, unipropsbunun ne olduğunu bilmiyor ve http://www.fileformat.info/ adresinde bulamıyorum . Yapan arkadaşının OS X'te (Linux'tayım) ve sistemlerinde normal bir yıldız işareti olarak çalıştığını biliyorum. Slack'in bir şekilde değiştirdiğini farz ediyorum. Bu karakterin ne olduğu hakkında fikri olan var mı?

Tuhaf karakteri doğrudan sorudan kopyalayamadığınızı unutmayın. Görünüşe göre, Yığın Değişim motoru, izleyen yazdırılmayan karakterleri çıkarır. "Düzenle" bağlantısını tıklayın ve bunun yerine kopyalayın.


unipropsUnicode::TusslePerl modülünde yer alan, verdiğiniz karakter hakkındaki bilgileri tanımlayan ve basan küçük, temiz bir betiktir .


Çoğaltamıyor. Kullandığım ord("*")senin yapıştırılan dize ve yerli için *anahtarın ve her iki (42) için aynı numarası var.
Mart Ho,

7
Kahretsin, kahretsin, SE motoru yiyor gibi gözüküyor. Göndermeden önce test ettim ve garip karakteri kopyalayabiliyorum (bununla birlikte, sorunun orada fazladan basılmış olmayan karakterlerin olduğunu da anlamaya başladım) ancak gönderilen sorudan da kopyalayamıyorum. Düzenle bağlantısını tıklamanız ve oradan kopyalamanız gerekir.
terdon

2
İşin garibi, Android uygulamasında, boşluklu sıfır, normal bir boşlukmuş gibi görüntülenir.
derobert

1
İlginçtir, 'edit' den terminalime yapıştırdığımda urxvt, zaten olarak görüntülenir *<200b>.
bodo

Kod bölümünden, örneğin uniprops satırından kopyalarsanız, soru kaynağına gitmenize gerek kalmadan Tamam'ı kopyalar. (Python3 tercüman yapıştırmak olarak gösterir '*\u200b'çok)
TessellatingHeckler

Yanıtlar:


71

Yapıştırma işlemi, normal bir yıldız işareti olan yıldız işareti nedeniyle değil, Unicode karakteri U + 200B nedeniyle başarısız oldu . Karakter a ZERO WIDTH SPACEolduğundan, kopyalandığında görüntülenmez.

Python kodunu kullanarak:

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

İşlev uniconvgiriş dizesini (bu durumda u"'*'?") onaltılık biçimde Unicode kod sayfası eşdeğerlerine dönüştürür. uDizeye önek Unicode dizesi olarak dizeyi tanımlar.

Çıktıyı elde etmeyi başardım:

0x27 0x2a 0x200b 0x27 0x3f

Biz açıkça görebiliriz 0x27, 0x2ave 0x3fASCII / Unicode onaltılık karakter için değerlerdir ', *ve ?sırasıyla. Böylece 0x200b, karakter belirlenir.

Python kodunun gövdeye yapıştırıldığında SE + 'nin Markdown yazılımı tarafından kaldırılan U + 200B karakterine sahip olduğuna dikkat edin. Beklenen sonucu elde etmek için, Düzenleme görünümünü kullanarak doğrudan başlıktan kopyalamanız gerekir.


5
Değiştirme strile hextanımak veya bakmak için onları kolaylaşır onaltılık irade çıkışı codepoints.
del

unicodedataKarakter isimlerini, kategorileri vb.
Sorgulayabileceğiniz

4
ZERO WIDTH SPACE ve ZERO WIDTH JOINER karakterleri, genel spam terimlerini engellemeye çalışan yorum sistemlerinde kullanışlıdır. Örneğin, Bernie Sanders'ın Senato'ya Sosyalist olarak seçildiğine işaret etmek ("Cialis" için bir spam tuzağı açmadan) "HTML Varlıkları'na saygı duyulursa" Soci & zwj; alist "olarak yazın veya Karakter Eşlemindeki karaktere yapıştırın veya değilse eşdeğerdir.
Monty Harder,

27

Ask Ubuntu sohbet odasında @Rinzwind yardımı ile sorunun bir karakter olmadığını anladım. Çıktısına dikkat edin od:

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

342 200 213Başka karakterin bir sekizlik temsilidir ve kullanabileceğimiz bu siteyi bana arama:

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>

Yani, aslında sahip olduğum iki normal karakter *ve sıfır genişlikli bir karakterdi .


6
Bunu yapmanın başka bir yolu printf '\342\200\213' | uniname. (uniname uniutils paketindendir.)
del

1
Gönderen bu sitede farklı format dönüşümleri sahip olabilir: o verir HEX için 002A 200Butf-8 için, 2A E2 80 8Butf-16 için 002A 200B...
Hastur
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.