W tabeli ASCII istnieje znak „J”, który ma punkty kodowe w różnych systemach liczbowych:
Oct Dec Hex Char
112 74 4A J
Możliwe jest wydrukowanie tego znaku za pomocą ósemkowego punktu kodowego poprzez wydrukowanie
printf '\112'
lub echo $'\112'
. Jak wydrukować ten sam znak za pomocą dziesiętnych i szesnastkowych prezentacji punktów kodowych?
Odpowiedzi:
Klątwa:
Grudzień:
Alternatywa dla hexa :-)
źródło
awk
.Z
zsh
:Aby uzyskać znak (w bieżącym zestawie znaków) z punktu kodowego Unicode:
źródło
Ogólnie rzecz biorąc, powłoka może zrozumieć liczby szesnastkowe, ósemkowe i dziesiętne w zmiennych, pod warunkiem że zostały one zdefiniowane jako
integers
:Lub są wynikiem „rozszerzenia arytmetycznego”:
Potrzebujesz tylko jednego sposobu, aby wydrukować znak należący do wartości zmiennej.
Ale są dwa możliwe sposoby:
Potrzebne są dwa printf, jeden do przekształcenia wartości w łańcuch szesnastkowy, a drugi do wydrukowania znaku.
Drugi wydrukuje dowolny punkt UNICODE (jeśli konsola jest poprawnie ustawiona).
Na przykład:
Śnieżny człowiek.
Postać, która ma reprezentację utf-8 taką, jaka
f0 9f 90 ae
jest0x1F42E
. Wyszukaj,cow face site:fileformat.info
aby uzyskać :Uwaga : Występuje problem ze sposobem UNICODE polegający na tym, że w przypadku bash przed 4.3 (poprawionym w tej wersji i wyżej), znaki między punktami UNICODE 128 i 255 (dziesiętnie) mogą być niepoprawnie wydrukowane.
Bibliografia
Czwarty akapit
PARAMETERS
wman bash
:Wewnątrz „OCENY ARYTETYCZNEJ” w
man bash
:źródło
é
(liczba ósemkowa: 351, grudzień: 233, heksa: 0xE9) jest niepoprawnie wydrukowany,printf '\351'
ponieważ wypisuje wartość bajtu0xE9
zawsze. W przypadku terminala z kodowaniemISO-8859-1
(i kuzynów), który może działać, ale w terminalach zakodowanych w utf-8 wartość bajtu0xE9
powinna wynosić . cd ....\u
(który pochodzi z zsh).Dziesiętny:
Klątwa:
Funkcja może wykonywać sekwencje:
źródło
Możesz użyć biblioteki stdlib Awk POSIX :
źródło
Jeśli masz listę liczb do konwersji i chcesz uniknąć wywołania funkcji i utworzenia podpowłoki dla każdego znaku, możesz wcześniej zdefiniować zestaw ascii:
Zauważ, że znak zerowy jest wykluczony, więc każdy znak jest przesunięty o 1.
Następnie użyj czegoś takiego (zakłada 1 liczbę na linię):
źródło
Oto wszystkie konwersje za pomocą
printf
:źródło