Seorang teman menempelkan perintah ke ruang obrolan Slack yang berisi karakter *
. Ini terlihat seperti normal *
tetapi tidak:
$ uniprops '*'
uniprops: no character named ‹*›
Sementara jika saya menjalankan uniprops
tanda bintang yang saya dapatkan saat mengetik di komputer saya, saya mendapatkan:
$ 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
Saya juga dapat melihat bahwa itu bukan tanda bintang yang sebenarnya dengan melewati od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Sedangkan yang normal memberi:
$ printf '*' | od -c
0000000 *
0000001
Inilah karakter misteri yang sedikit lebih besar:
*
Dan tanda bintang normal (ya, mereka memang terlihat identik):
*
Jadi, uniprops
tidak tahu apa ini, dan saya juga tidak bisa menemukannya di http://www.fileformat.info/ . Saya tahu bahwa teman yang menempelnya ada di OS X (saya di Linux) dan itu bekerja di sistem mereka sebagai tanda bintang biasa. Saya berasumsi bahwa Slack entah bagaimana mengubahnya. Jadi, adakah yang tahu karakter apa itu?
Perhatikan bahwa Anda tidak dapat menyalin karakter aneh langsung dari pertanyaan. Rupanya, mesin Stack Exchange menghapus karakter yang tidak dicetak. Klik tautan "edit" dan salin dari sana.
uniprops
adalah skrip kecil rapi yang termasuk dalam Unicode::Tussle
modul Perl yang mengidentifikasi dan mencetak informasi tentang karakter yang Anda berikan.
sumber
ord("*")
untuk string yang disisipkan dan*
kunci asli , dan mendapat nomor yang sama untuk keduanya (42).urxvt
, sudah ditampilkan sebagai*<200b>
.'*\u200b'
juga)Jawaban:
Tempel gagal bukan karena tanda bintang, yang merupakan tanda bintang biasa, tetapi karena karakter Unicode U + 200B . Karena karakternya adalah
ZERO WIDTH SPACE
, ia tidak ditampilkan ketika disalin.Menggunakan kode Python:
Fungsi
uniconv
mengubah string input (dalam hal ini,u"'*'?"
) ke dalam bentuk kode setara Unicode dalam format heksadesimal. Theu
awalan untuk string mengidentifikasi string sebagai string Unicode.Saya bisa mendapatkan output:
Kita dapat dengan jelas melihat itu
0x27
,0x2a
dan0x3f
merupakan nilai heksadesimal ASCII / Unicode untuk karakter'
,*
dan?
masing - masing. Yang meninggalkan0x200b
, oleh karena itu mengidentifikasi karakter.Perhatikan bahwa kode Python, ketika disisipkan ke dalam tubuh, memiliki karakter U + 200B dihapus oleh perangkat lunak Markdown SE. Untuk mendapatkan hasil yang diharapkan, Anda harus menyalinnya langsung dari judul menggunakan tampilan Edit.
sumber
str
denganhex
akan menampilkan codepoint dalam heksadesimal, membuatnya lebih mudah untuk dikenali atau dicari.unicodedata
, yang dengannya Anda dapat menanyakan nama karakter, kategori dll.Dengan bantuan @Rinzwind di ruang obrolan Tanya Ubuntu, saya menemukan bahwa masalahnya bukanlah karakter sama sekali. Perhatikan output dari
od
:Ini
342 200 213
adalah representasi oktal dari karakter lain dan kita dapat menggunakan situs ini untuk mencarinya:Jadi, yang sebenarnya saya miliki adalah dua karakter unicode, ruang normal
*
dan nol lebar.sumber
printf '\342\200\213' | uniname
. (Uniname berasal dari paket uniutils.)002A 200B
, untuk utf-82A E2 80 8B
untuk utf-16002A 200B
...