Przyjaciel wkleił polecenie do pokoju rozmów Slack, który zawierał postać *
. To wygląda normalnie, *
ale nie jest:
$ uniprops '*'
uniprops: no character named ‹*›
Chociaż jeśli uruchomię uniprops
gwiazdkę, którą otrzymuję podczas pisania na moim komputerze, otrzymuję:
$ 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
Widzę też, że nie jest to prawdziwa gwiazdka, przepuszczając ją od
:
$ printf '*' | od -c
0000000 * 342 200 213
0000004
Podczas gdy normalny daje:
$ printf '*' | od -c
0000000 *
0000001
Oto tajemnicza postać nieco większa:
*
I normalna gwiazdka (tak, wyglądają identycznie):
*
Więc uniprops
nie wie, co to jest i nie mogę tego znaleźć na stronie http://www.fileformat.info/ . Wiem, że przyjaciel, który go wkleił, jest w systemie OS X (jestem w systemie Linux) i że działa on w ich systemie jako zwykła gwiazdka. Zakładam, że Slack jakoś to zmienił. Czy ktoś ma pojęcie, czym jest ta postać?
Pamiętaj, że nie możesz skopiować dziwnej postaci bezpośrednio z pytania. Najwyraźniej silnik Stack Exchange usuwa końcowe znaki niedrukowalne. Kliknij link „edytuj” i skopiuj stamtąd.
uniprops
jest zgrabnym, małym skryptem zawartym w Unicode::Tussle
module Perla, który identyfikuje i drukuje informacje o nadanym znaku.
źródło
ord("*")
twojego wklejonego ciągu i*
klucza natywnego , i dostałem ten sam numer dla obu (42).urxvt
, jest on już wyświetlany jako*<200b>
.'*\u200b'
)Odpowiedzi:
Wklejanie nie powiodło się nie z powodu gwiazdki, która jest idealnie regularną gwiazdką, ale z powodu znaku Unicode U + 200B . Ponieważ znak jest znakiem
ZERO WIDTH SPACE
, nie jest wyświetlany po skopiowaniu.Za pomocą kodu Python:
Funkcja
uniconv
konwertuje ciąg wejściowy (w tym przypadkuu"'*'?"
) na ich ekwiwalenty strony kodowej Unicode w formacie szesnastkowym.u
Prefiks ciąg identyfikujący ciąg jako ciąg znaków Unicode.Byłem w stanie uzyskać wynik:
Widzimy wyraźnie, że
0x27
,0x2a
i0x3f
są wartościami szesnastkowym ASCII / Unicode dla znaków'
,*
i?
odpowiednio. To pozostawia0x200b
, identyfikując w ten sposób charakter.Zauważ, że kod Pythona po wklejeniu do ciała miał znak U + 200B usunięty przez oprogramowanie Markdown SE. Aby uzyskać oczekiwany wynik, musisz skopiować go bezpośrednio z tytułu za pomocą widoku Edycja.
źródło
str
zhex
wyjściem będzie codepoints w systemie szesnastkowym, co czyni je łatwiej rozpoznać czy patrzeć w górę.unicodedata
, za pomocą którego można wyszukiwać nazwy postaci, kategorie itp.Z pomocą @Rinzwind w czacie Ask Ubuntu doszedłem do wniosku, że problemem wcale nie jest postać. Zwróć uwagę na wynik
od
:342 200 213
Jest ósemkowa reprezentacja innego charakteru i możemy korzystać z tej strony , aby to sprawdzić:Więc tak naprawdę miałem dwa znaki Unicode, normalną
*
i zerową szerokość.źródło
printf '\342\200\213' | uniname
. (uniname pochodzi z pakietu uniutils.)002A 200B
, dla utf-82A E2 80 8B
dla utf-16002A 200B
...