Chciałbym dodać czaszkę i skrzyżowane piszczele Unicode do mojego monitu powłoki (konkretnie „CZASZKA I KRZYŻOWCE” (U + 2620)), ale nie mogę rozgryźć magicznej inkantacji, która sprawiłaby, że echo wyplułoby ją, lub jakiekolwiek inne, 4-cyfrowy znak Unicode. Dwucyfrowe są łatwe. Na przykład echo -e "\ x55",.
Oprócz poniższych odpowiedzi należy zauważyć, że oczywiście twój terminal musi obsługiwać Unicode, aby wynik był zgodny z oczekiwaniami. gnome-terminal robi to dobrze, ale niekoniecznie jest domyślnie włączony.
W aplikacji terminalowej systemu macOS przejdź do Preferencje-> Kodowania i wybierz Unicode (UTF-8).
bash
shell
unicode
character-encoding
masukomi
źródło
źródło
"\x7F"
ustawień regionalnych UTF-8 (którebash
znacznik sugeruje, że masz )… wzorce reprezentowane przez pojedynczy bajt nigdy nie są w zakresie\x80-\xFF
. Ten zakres jest nielegalny w jednobajtowych znakach UTF-8. np. wartość Unicode Codepoint wynoszącaU+0080
(tj.\x80
) w rzeczywistości wynosi 2 bajty w UTF-8 ..\xC2\x80
..printf "\\u007C\\u001C"
.gnome-terminal
,echo -e '\ufc'
nie wywołuje u, nawet w postaci zestawu do kodowania UTF-8. Jednak np.urxvt
Drukuje np.printf "\\ub07C\\ub01C"
Zgodnie z oczekiwaniami (bez znaku lub ramki).bash
tag jest tak przydatną wskazówką? Czy różne terminale są wspólne w CJK lub…?Odpowiedzi:
W UTF-8 jest to właściwie 6 cyfr (lub 3 bajty).
Aby sprawdzić, jak jest zakodowany przez konsolę, użyj hexdump:
źródło
LANG=C
zamiastLANG=en_US.UTF-8
. Teraz moje terminale w Gnome poprawnie wyświetlają symbole ... Prawdziwe terminale (tty1-6) wciąż tego nie robią.0000000 f0 9f 8d ba
tłumaczy na\xf0\x9f\x8d\xba
. Przykład echo:echo -e "\xf0\x9f\x8d\xba"
.$'...'
składni, aby uzyskać zakodowaną postać w zmiennej bez używania$(...)
powłoki w tle przechwytywania, do stosowania w sytuacjach, które same nie interpretować sekwencje ucieczki:skull=$'\xE2\x98\xA0'
0000000 98e2 00a0
. Oczywiście0000000
jest to tylko nieważne przesunięcie, ale bajty po nim tłumaczą się\xe2\x98\xa0
, ponieważ maszyna używa małej kolejności bajtów endian.Działa to w Zsh (sprawdziłem wersję 4.3) oraz w Bash 4.2 lub nowszym.
źródło
Tak długo, jak edytory tekstu radzą sobie z Unicode (przypuszczalnie zakodowanym w UTF-8), możesz bezpośrednio wprowadzić kod-Unicode.
Na przykład, w edytorze tekstów Vima wchodzisz w tryb wstawiania i naciskasz Ctrl+ V+, Ua następnie liczbę kodową jako 4-cyfrową liczbę szesnastkową (w razie potrzeby z zerami). Więc wpisz Ctrl+ V+ U 2 6 2 0. Zobacz: Jaki jest najłatwiejszy sposób wstawienia znaków Unicode do dokumentu?
Na terminalu, na którym działa Bash, wpisz CTRL+ SHIFT+ Ui wpisz szesnastkowy kodowy znak żądanego znaku. Podczas wprowadzania kursor powinien pokazywać podkreślenie
u
. Pierwsza niecyfrowana cyfra kończy wprowadzanie i renderuje znak. Możesz więc móc wydrukować U + 2620 w Bash, korzystając z następujących czynności:echo CTRL+ SHIFT+U2620ENTERENTER
(Pierwsze wejście kończy wejście Unicode, a drugie uruchamia
echo
polecenie).Źródło: Zapytaj Ubuntu SE
źródło
C-S-u 2 6 2 0
jest funkcją emulatora terminala, X Input Method (XIM) lub podobną. AFAIK, nie będzie można wysłać obuSHIFT
iCTRL
do warstwy terminalowej. Terminal mówi tylko znakami, a nie kluczami i kodami kluczy, takimi jak Twój serwer X (jest również 7-bitowy do wszystkich celów i celów). W tym świecieCTRL
maskuje 4 najbardziej znaczące bity (i 0b00001111), co powodujeOto w pełni wewnętrzna implementacja Bash, bez rozwidlania, nieograniczony rozmiar znaków Unicode.
Wynik był:
źródło
Wystarczy wpisać „☠” w skrypcie powłoki. W prawidłowych ustawieniach narodowych i na konsoli obsługującej Unicode wydrukuje się dobrze:
Brzydkim „obejściem” byłoby wyjście z sekwencji UTF-8, ale zależy to również od zastosowanego kodowania:
źródło
Szybka jednowierszowa konwersja znaków UTF-8 na ich 3-bajtowy format:
źródło
printf "\\\x%s" $(printf '☠'|xxd -p -c1 -u)
.... xxd jest wysyłany jako część pakietu „vim-common”hexFromGlyph(){ if [ "$1" == "-n" ]; then outputSeparator=' '; shift; else outputSeparator='\n'; fi for glyph in "$@"; do printf "\\\x%s" $(printf "$glyph"|xxd -p -c1 -u); echo -n -e "$outputSeparator"; done } # usage: $ hexFromGlyph ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF $ hexFromGlyph -n ☠ ✿ \xE2\x98\xA0 \xE2\x9C\xBF
codepoints () { printf 'U+%04x\n' ${@/#/\'} ; } ; codepoints A R ☯ 🕉 z
... ciesz się 👍Używam tego:
Jest to o wiele łatwiejsze niż wyszukiwanie reprezentacji szesnastkowej ... Używam tego w moich skryptach powłoki. To działa na gnome-term i urxvt AFAIK.
źródło
Może być konieczne zakodowanie punktu kodowego w postaci ósemkowej, aby możliwe było szybkie rozwinięcie w celu prawidłowego odkodowania.
U + 2620 kodowany jako UTF-8 to E2 98 A0.
Więc w Bash
sprawi, że twoja skorupa zmieni się w czaszkę i kości.
źródło
W bash, aby wydrukować znak Unicode do wydrukowania, użyj \ x, \ u lub \ U (pierwszy dla 2-cyfrowego szesnastkowego, drugi dla 4-cyfrowego szesnastkowego, trzeci dla dowolnej długości)
Chcę przypisać go do zmiennej użyj składni $ '...'
źródło
Jeśli nie przeszkadza Ci liniowiec Perl:
-CS
umożliwia dekodowanie UTF-8 na wejściu i kodowanie UTF-8 na wyjściu.-E
ocenia następny argument jako Perl, z nowoczesnymi funkcjami, takimi jaksay
włączone. Jeśli nie chcesz nowego wiersza na końcu, użyjprint
zamiastsay
.źródło
Każde z tych trzech poleceń wyświetli żądany znak w konsoli, pod warunkiem, że konsola akceptuje znaki UTF-8 (większość z nich to robi):
Następnie możesz skopiować i wkleić rzeczywisty glif (obraz, znak) do dowolnego edytora tekstowego (z obsługą UTF-8).
Jeśli chcesz zobaczyć, jak taki punkt kodowania Unicode jest kodowany w UTF-8, użyj xxd (znacznie lepsza przeglądarka szesnastkowa niż od):
Lub, w HEX, aby uniknąć błędów: 0xE2 0x98 0xA0. Oznacza to, że wartości między spacją (HEX 20) a liniowym przesunięciem (Hex 0A).
Jeśli chcesz zagłębić się w konwersję liczb na znaki: spójrz tutaj, aby zobaczyć artykuł z wiki Grega (BashFAQ) na temat kodowania ASCII w Bash!
źródło
printf
Wbudowane (podobnie jak coreutils'printf
) zna\u
sekwencję escape która akceptuje 4-cyfrowe znaki Unicode:Test z Bash 4.2.37 (1):
źródło
\printf
użyć autonomicznego pliku wykonywalnego lub wypróbuj zaktualizowaną wersję bashPrzepraszamy za wznowienie tego starego pytania. Ale przy użyciu
bash
istnieje bardzo łatwe podejście do tworzenia punktów kodowych Unicode na podstawie zwykłego wejścia ASCII, które nawet się nie rozwidlają :Użyj go w następujący sposób, aby zdefiniować pewne punkty kodowe
lub zrzucenie pierwszych 65536 znaków kodowych Unicode na standardowe wyjście (zajmuje to mniej niż 2 s na mojej maszynie. Dodatkową przestrzenią jest zapobieganie spływaniu niektórych znaków ze względu na czcionkę o stałej szerokości powłoki):
lub aby opowiedzieć trochę bardzo typową historię rodzica (wymaga Unicode 2010):
Wyjaśnienie:
printf '\UXXXXXXXX'
wypisuje dowolny znak Unicodeprintf '\\U%08x' number
drukuje\UXXXXXXXX
z liczbą przekonwertowaną na heksadecymalną, która jest następnie podawana do innej wprintf
celu wydrukowania znaku Unicodeprintf
rozpoznaje liczby ósemkowe (0oct), szesnastkowe (0xHEX) i dziesiętne (0 lub liczby rozpoczynające się od 1 do 9) jako liczby, dzięki czemu możesz wybrać dowolną reprezentację, która najlepiej pasujeprintf -v var ..
zbiera dane wyjścioweprintf
do zmiennej, bez widelca (co ogromnie przyspiesza rzeczy)local variable
ma tam nie zanieczyszczać globalnej przestrzeni nazwlocal -n var=other
aliasyvar
doother
, takie jak przypisanie dovar
zmianother
. Jedną z interesujących części jest to, żevar
jest częścią lokalnej przestrzeni nazw, podczas gdyother
jest częścią globalnej przestrzeni nazw.local
aniglobal
przestrzeń nazwbash
. Zmienne są przechowywane w środowisku i takie są zawsze globalne. Lokalny po prostu odkłada bieżącą wartość i przywraca ją, gdy funkcja zostanie ponownie opuszczona. Inne funkcje wywoływane z funkcji za pomocąlocal
będą nadal widzieć wartość „lokalną”. Jest to całkowicie inna koncepcja niż wszystkie normalne reguły określania zakresu występujące w innych językach (a to, cobash
działa, jest bardzo potężne, ale może prowadzić do błędów, jeśli jesteś programistą, który nie jest tego świadomy).źródło
Oto lista wszystkich dostępnych emoji Unicode:
https://en.wikipedia.org/wiki/Emoji#Unicode_blocks
Przykład:
Aby uzyskać wartość ASCII tego znaku, użyj hexdump
A następnie użyj wartości podanych w formacie szesnastkowym
źródło
Na podstawie pytań o przepełnienie stosu Wytnij uniks, usuń pierwszy token i https://stackoverflow.com/a/15903654/781312 :
Dane wyjściowe są następujące.
źródło
Łatwe dzięki jedno-liniowej wersji Python2 / 3:
Prowadzi do:
źródło
W Bash:
Wynik:
źródło
Jeśli znana jest wartość szesnastkowa znaku Unicode
Jeśli znana jest wartość dziesiętna znaku Unicode
źródło