Emotikony wydają się być określone przy użyciu formatu U + xxxxx, w
którym każdy x jest cyfrą szesnastkową.
Na przykład U + 1F615 to oficjalny kod konsorcjum Unicode dla „zdezorientowanej twarzy” 😕
Ponieważ często jestem zdezorientowany, mam silne powinowactwo do tego symbolu.
Reprezentacja U + 1F615 jest dla mnie myląca, ponieważ myślałem, że jedyne możliwe kodowanie znaków Unicode wymaga 8, 16, 24 lub 32 bitów, podczas gdy 5 cyfr szesnastkowych wymaga 5x4 = 20 bitów.
Odkryłem, że ten symbol wydaje się być reprezentowany przez zupełnie inny ciąg szesnastkowy w bash:
$echo -n 😕 | hexdump
0000000 f0 9f 98 95
0000004
$echo -e "\xf0\x9f\x98\x95"
😕
$PS1=$'\xf0\x9f\x98\x95 >'
😕 >
Spodziewałbym się, że U + 1F615 przekonwertuje na coś takiego jak \ x00 \ x01 \ xF6 \ x15 .
Nie widzę związku między tymi 2 kodowaniami?
Kiedy szukam symbolu na oficjalnej liście konsorcjum Unicode , chciałbym móc użyć tego kodu bezpośrednio, bez konieczności ręcznej konwersji w tak żmudny sposób. to znaczy
- znalezienie symbolu na jakiejś stronie internetowej
- kopiowanie do schowka przeglądarki internetowej
- wklejenie go w bash, aby wywołać echo przez zrzut heksowy i odkryć PRAWDZIWY kod.
Czy mogę użyć tego 20-bitowego kodu, aby ustalić, co to jest 32-bitowy kod?
Czy istnieje związek między tymi 2 liczbami?
źródło
\U1F615
po nim następuje kolejna ważna cyfra szesnastkowa, to będzie to założone, że jest częścią sekwencji specjalnej. Aby działało niezależnie od tego, po czym następuje, musi mieć wystarczającą liczbę zer wiodących, aby mieć dokładnie osiem cyfr:\U0001F615
Oto sposób konwersji z UTF-32 (big endian) na UTF-8
Zauważysz tam swoją wartość szesnastkową
0x01F615
, wypełnioną dodatkowym początkowym 0, aby wypełnić 32 bity.Strona Wikipedii na temat UTF-8 bardzo wyraźnie wyjaśnia transformację z punktu kodowego Unicode na jego reprezentację UTF-8. Ale próba zrobienia tego samemu w skryptach powłoki może nie być najlepszym pomysłem.
UTF-32 ma stałą szerokość, a zgodność między punktem kodowym a reprezentacją UTF-32 jest banalna - wartość jest taka sama.
źródło
Miły sposób na zrobienie tego w głowie lub na papierze:
Zastanów się, ile to będzie bajtów: wartości pod U + 0080 to jeden bajt, w przeciwnym razie pod U + 0800 są 2 bajty, w innym przypadku pod U + 10000 są 3 bajty, w przeciwnym razie 4 bajty. W twoim przypadku 4 bajty.
Konwertuj szesnastkowy na ósemkowy:
0373025
.Począwszy od końca, peel off 2 cyfry ósemkowe na raz, aby uzyskać sekwencję wartości ósemkowe:
037
030
025
.Jeśli masz mniej niż wartości ósemkowe oczekiwanej liczby bajtów, dodać dodatkową 0 na początku:
000
037
030
025
.Dla wszystkich, ale po pierwsze, na dodatek
0200
dostać:000
0237
0230
0225
.Na pierwszy, dodaj
0300
jeśli spodziewana długość wynosi 2,0340
jeśli jest to 3, lub0360
jeśli jest to 4, otrzymujemy:360
0237
0230
0225
.Teraz napisać jako ciąg ósemkowe ucieczek:
\360\237\230\225
. Opcjonalnie możesz przekonwertować z powrotem na hex, jeśli chcesz.źródło