Mam listę znaków kodowych Unicode, ale nie znam „prostego” sposobu konwersji tych wartości szesnastkowych na rzeczywiste znaki, które reprezentują ...
Słyszałem, że zsh ma echo -e '\u0965'
, ale używam bash 4.1.
Czy istnieje coś tak prostego jak metoda zsh dla bash?
Odpowiedzi:
Możesz użyć echa basha lub / bin / echo z GNU coreutils w połączeniu z iconv:
Domyślnie iconv konwertuje na kodowanie ustawień regionalnych. Być może bardziej przenośnym niż poleganiem na konkretnej powłoce lub poleceniu echa jest Perl. Większość systemów UNIX, o których wiem, ma dostępny Perl, a nawet ma kilka portów Windows.
Przez większość czasu, gdy muszę to zrobić, jestem w edytorze takim jak Vim / GVim, który ma wbudowane wsparcie. W trybie wstawiania naciśnij Ctrl-V, a następnie u, a następnie wpisz cztery znaki szesnastkowe. Jeśli chcesz znaku poza U + FFFF, użyj dużej litery U i wpisz 8 znaków szesnastkowych. Vim obsługuje również niestandardowe, łatwe do tworzenia mapy klawiszy. Konwertuje serię znaków na inny symbol. Na przykład mam opracowaną mapę klawiszy o nazwie www, która konwertuje TM na ™, (C) na ©, (R) na ® i tak dalej. Mam też mapę klawiszy dla Klingona, kiedy to staje się konieczne. Jestem pewien, że Emacs ma coś podobnego. Jeśli korzystasz z aplikacji GTK +, która zawiera GVim i GNOME Terminal, możesz spróbować Control-Shift-u, a następnie 4 znaków szesnastkowych, aby utworzyć znak Unicode. Jestem pewien, że KDE / Qt ma coś podobnego.
AKTUALIZACJA: Od wersji Bash 4.2 wydaje się być wbudowaną funkcją:
AKTUALIZACJA: W dzisiejszych czasach prawdopodobnie język Python byłby preferowany od Perla. Działa to zarówno w Pythonie 2, jak i 3:
źródło
chr 0xa2
drukuję w ustawieniach regionalnych UTF-8, otrzymuję znak centów ¢, ale jeśli używam LANG = C, dostaję , ponieważ wypisuje bajt 0xa2, który jest nieprawidłowy w UTF-8. Przykład Vim / GVim jest częściowo wrażliwy na ustawienia regionalne. Bardziej poprawnie, do kodowania pliku. Jeśli zacząłeś Vima w lokalizacji innej niż UTF-8, będziesz musiał:set encoding=utf-8
chr 0x12000
w Perlu (zakładając, że Unicode jest aktywny) do jego reprezentowania. W UTF-16BE jest to 0xd8, 0x08, 0xdc i 0x00. Twój znak to U + 0965, który akurat jest bajtami 0x09, a następnie 0x65 w UTF-16BE.perl
odpowiedź jest teraz najlepsza (jak na moje szczególne wymagania). Wcześniej wykluczyłem printf (miesiące temu) , ale o tym zapomniałem. Oto pytanie / odpowiedź na temat jego ograniczeń ... Dlaczego printf zgłasza błąd we wszystkich kodowychBash 4.2 (wydany w 2011) dodano wsparcie dla
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
aecho $'\u0965'
także pracy.http://tiswww.case.edu/php/chet/bash/FAQ :
źródło
bash 4.2.x
wersjach występuje błąd, w którym wartości między0x80
i0xff
(128 - 255
) - tj. w rozszerzonym zakresie ASCII - NIE są poprawnie zakodowane w UTF8 i zamiast tego po prostu przechodzą, w wyniku czego powstają nieprawidłowe znaki UTF8, które są renderowane przez niektóre terminale?
. Od (przynajmniej)4.3.11
zostało to naprawione; jeśliecho $'\ued'
renderujeí
, błąd nie jest obecny.Jeśli masz jądra GNU, spróbuj
printf
:echo
może wykonać zadanie, jeśli twoja konsola używa UTF-8 i masz kodowanie UTF-8:Tabelę kodowania szesnastkowego Unicode do UTF-8 można znaleźć tutaj: http://www.utf8-chartable.de/ . Możesz przekonwertować punkty kodu Unicode na heksadecymalne przy użyciu wielu języków skryptowych. Oto przykład z użyciem Pythona:
Poniżej znajduje się skrypt Perla, który przekonwertuje argumenty na poprawną wartość szesnastkową (tutaj wiele niepotrzebnych nawiasów):
Na przykład,
Oczywiście, jeśli masz Perla lub Pythona, możesz również użyć ich do wydrukowania znaków.
źródło
echo
Nie zrobię tego, co chcę, ponieważ Codepoints to 2-bajtowe UTF-16 Big-Endian .. ale przypomniałeś mi, że są 2 funkcje printf! (Myślałem, że printf może to zrobić i wydaje się, że wzywam niewłaściwy) ...$(which printf)
działa ... Dziękuję za przykład w pythonie .. ale za to (moja krzywa uczenia się) staram się trzymać tak blisko jak to tylko możliwe „bash” jako jedyny zaangażowany język. (kiedy czuję się swobodnie z bash, utknę w Pythonie… btw,.encode('hex')
jest o krok dalej niż to, czego potrzebuję… trochę tam zajęci :)printf
powyższego, ale nie obsługuje wartości poniżej rozwiązania `` \ u00A0... I've just re-discovered something I already knew (but dropped off the radar)... Here is a Question I asked about 4 months ago; [Why does printf report an error on all but three (ASCII-range) Unicode Codepoints](http://askubuntu.com/questions/20806/why-does-printf-report-an-error-on-all-but-three-ascii-range-unicode-codepoints)... So *penguin359's*
perl` 'wygląda teraz całkiem nieźle :) .. To pojedyncze wywołanie, a ja po „łatwym pisaniu”, więc dam mu zielonyperl
UPDATE: Oto sposób bash zrobić pojedynczą wartość Unicode ... (przez "bash" To znaczy: nie stosując dowolny inny język skryptowy) .. dzięki Gilles dla suggeston w tym askubuntu Q / A .
Zgodnie z tym linkiem : recode (Przestarzałe iconv, dos2unix, unix2dos) .. Edytuj: ale zgodnie z komentarzem poniżej „przestarzałe” mogą oznaczać tylko „alternatywę”
Oto metoda przetwarzania surowego zrzutu heksadecymalnego jako danych wejściowych (tj. Bez poprzedzających znaków, takich jak; \ u0965 i no \ x09 \ x65) ..
xxd
to narzędzie do zrzutów szesnastkowych (w pakiecievim-common
), które może przywrócić surowy zrzut heksadecymalny do znaków, które zrzut reprezentuje ... Punkty kodowe Unicode są UTF-16BigEndian, co jest dokładnie tym, co jest zrzutem szesnastkowym ..xxd
w trybie przywracania przyjmuje strumień wartości szesnastkowych z podziałem linii. które są ignorowane.Ten skrypt tworzy strumień UTF-16BE, który następnie powraca do oryginalnych znaków.
Ostatni wiersz zawiera dwa potrzebne polecenia;
xxd
iiconv
Oto dane wyjściowe (najpierw przedstawiające dane zrzutu szesnastkowego UTF-16BE).
Uwaga;
xxd
dzieli swój wynik na nowy wiersz z 60 cyframi szesnastkowymi ... Opcja cofania ignoruje te nowe linie .. ignoruje wszystkie / wszystkie nowe linie (ponieważ nie są to cyfry szesnastkowe) ..źródło
bash
metody. Przez „bash” mam na myśli: używanie języka skryptowego bash; nie python / perl z bash). Dodałem to jako odpowiedź, ponieważ może to mieć wartość dla osoby czytającej tę stronę. Jest to dobra jednowierszowa dla całego pliku. Twojaprintf
odpowiedź jest dla mnie najlepsza.Zakładając, że domyślnym kodowaniem dla twojego systemu operacyjnego jest UTF-8 (prawda dla większości obecnych dystrybucji), możesz użyć bash bezpośrednio do konwersji dowolnego kodu UNICODE:
Oczywiście glif będzie wyświetlany poprawnie tylko wtedy, gdy masz prawidłową czcionkę. Od wersji bash 4.3 wszystkie punkty kodowe będą działać poprawnie. I te dwie wbudowane opcje również będą działać:
Zauważ, że dla bash 4.2 punkty Unicode od
0x80
do0xFF
są niepoprawnie zakodowane (błąd bash). Aby obejść ten problem, musisz rzucić okiem na program w tej witrynie (również dobry do dogłębnego zapoznania się z zagadnieniem konwersji liczb na znaki).źródło
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Opis: \ u i \ U niepoprawnie kodują wartości między \ u80 a \ uffUżywanie podstawiania wzorców w wersji bash 4.2 (i wyższej):
jak opisano tutaj http://steve-parker.org/sh/tips/pattern-substitution/
źródło