Saya memiliki daftar titik kode Unicode, tetapi saya tidak tahu cara "sederhana" untuk mengubah nilai hex ini menjadi karakter aktual yang mereka wakili ...
Saya pernah mendengar bahwa zsh memiliki echo -e '\u0965'
, tetapi saya menggunakan bash 4.1.
Apakah ada sesuatu yang sederhana seperti metode zsh, untuk bash?
Jawaban:
Anda dapat menggunakan gema bash atau / bin / echo dari GNU coreutils dalam kombinasi dengan iconv:
Secara default, ikon dikonversi ke penyandian lokal Anda. Mungkin lebih portabel daripada mengandalkan shell atau perintah echo tertentu adalah Perl. Hampir semua sistem UNIX yang saya ketahui memiliki Perl dan bahkan memiliki beberapa port Windows.
Sebagian besar waktu ketika saya perlu melakukan ini, saya berada di editor seperti Vim / GVim yang memiliki dukungan bawaan. Saat dalam mode insert, tekan Ctrl-V diikuti oleh u, lalu ketikkan empat karakter hex. Jika Anda menginginkan karakter di luar U + FFFF, gunakan huruf kapital U dan ketik 8 karakter hex. Vim juga mendukung custom keymaps yang mudah dibuat. Itu mengubah serangkaian karakter ke simbol lain. Sebagai contoh, saya punya keymap yang saya kembangkan bernama www, itu mengubah TM ke ™, (C) ke ©, (R) ke ®, dan seterusnya. Saya juga punya peta kunci untuk Klingon ketika itu menjadi perlu. Saya yakin Emacs memiliki sesuatu yang serupa. Jika Anda berada di aplikasi GTK + yang mencakup GVim dan Terminal GNOME, Anda dapat mencoba Control-Shift-u diikuti oleh 4 karakter hex untuk membuat karakter Unicode. Saya yakin KDE / Qt memiliki sesuatu yang serupa.
UPDATE: Pada Bash 4.2, tampaknya fitur bawaan sekarang:
UPDATE: Juga, saat ini contoh Python mungkin akan lebih disukai daripada Perl. Ini berfungsi di Python 2 dan 3:
sumber
chr 0xa2
di lokal UTF-8 saya mendapat tanda sen ¢, tetapi jika saya menggunakan LANG = C, saya mendapatkan karena mencetak byte 0xa2 yang tidak valid di UTF-8. Contoh Vim / GVim semi sensitif terhadap lokal. Lebih tepatnya, ke penyandian file. Jika Anda memulai Vim di lokal non-UTF-8, Anda perlu:set encoding=utf-8
chr 0x12000
di Perl (dengan asumsi Unicode aktif) untuk mewakilinya. Di UTF-16BE, ini adalah 0xd8, 0x08, 0xdc, dan 0x00. Karakter Anda adalah U + 0965 yang kebetulan merupakan byte 0x09 diikuti oleh 0x65 di UTF-16BE.perl
jawaban Anda sekarang adalah yang terbaik (untuk persyaratan khusus saya) .. Saya sebelumnya mengesampingkan printf (bulan lalu) , tapi aku sudah lupa tentang itu. Inilah pertanyaannya / jawab tentang batasannya ... Mengapa printf melaporkan kesalahan pada semua kecuali tiga (ASCII-range) Unicode CodepointsBash 4.2 (dirilis pada 2011) menambahkan dukungan untuk
echo -e '\u0965'
,printf '\u0965'
,printf %b '\u0965'
danecho $'\u0965'
juga bekerja.http://tiswww.case.edu/php/chet/bash/FAQ :
sumber
bash 4.2.x
versi memiliki bug di mana nilai antara0x80
dan0xff
(128 - 255
) - yaitu, dalam rentang ASCII yang diperluas - TIDAK dikodekan dengan benar UTF8 dan alih-alih hanya dilewati, menghasilkan karakter UTF8 yang tidak valid yang beberapa terminal render sebagai?
. Pada (setidaknya)4.3.11
ini telah diperbaiki; jikaecho $'\ued'
direnderí
, maka bug tidak ada.Jika Anda memiliki GNU coreutils, coba
printf
:echo
dapat melakukan pekerjaan jika konsol Anda menggunakan UTF-8 dan Anda memiliki pengkodean UTF-8:Anda dapat menemukan tabel Unicode ke UTF-8 hex encodings di sini: http://www.utf8-chartable.de/ . Anda dapat mengonversi poin kode Unicode ke hex menggunakan sejumlah bahasa scripting. Berikut ini contoh menggunakan python:
Berikut ini adalah skrip Perl yang akan mengonversi argumen ke nilai hex yang benar (banyak tanda kurung yang tidak perlu di sini):
Contohnya,
Tentu saja, jika Anda menggunakan Perl atau Python, Anda juga bisa menggunakannya untuk mencetak karakter.
sumber
echo
akan melakukan apa yang saya inginkan, karena Codepoint adalah 2-byte UTF-16 Big-Endian .. tetapi Anda telah mengingatkan saya bahwa ada 2 fungsi printf! (Saya pikir printf bisa melakukannya, dan sepertinya saya salah menggunakan) ...$(which printf)
berfungsi ... Terima kasih untuk contoh python .. tetapi untuk ini (kurva pembelajaran saya), saya mencoba untuk tetap sedekat mungkin mungkin untuk "bash" sebagai satu-satunya bahasa penulisan yang terlibat .. (ketika saya cukup nyaman dengan bash, saya akan terjebak ke Python ... btw,.encode('hex')
adalah satu langkah di luar apa yang saya butuhkan .. (saya pikir itu tampak agak sibuk di sana :)printf
atas, tetapi tidak menangani nilai-nilai di bawah ini `` perl... 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*
u solusi ` terlihat cukup bagus sekarang :) .. Ini adalah invocaton tunggal, dan saya setelah" mudah mengetik ", jadi saya akan memberikan centang hijau untukperl
UPDATE: Ini adalah cara bash untuk melakukan nilai Unicode tunggal ... (dengan "bash" Maksud saya: tidak menggunakan bahasa scripting lain) .. terima kasih kepada Gilles untuk saran pada Q / A askubuntu ini .
Menurut tautan ini : recode (Obsoletes iconv, dos2unix, unix2dos) .. Edit: tetapi sesuai komentar di bawah ini, "obsoletes 'bisa berarti" alternatif "
Berikut adalah metode untuk memproses dump hex mentah sebagai input (mis. Tidak ada awalan lolos seperti; \ u0965, dan no \ x09 \ x65) ..
xxd
adalah utilitas hex-dump (dikemas denganvim-common
) yang dapat mengembalikan dump hex mentah untuk karakter yang diwakili oleh dump ... Unicode Codepoints adalah UTF-16BigEndian, yang merupakan dump Hex-sebenarnya ..xxd
dalam mode revert menerima aliran nilai-nilai Hex dengan jeda baris. yang diabaikan.Script ini menciptakan aliran UTF-16BE, yang kemudian kembali ke karakter aslinya.
Baris terakhir berisi dua perintah yang dibutuhkan;
xxd
daniconv
Ini adalah output (pertama-tama menunjukkan input hex-dump UTF-16BE).
Catatan;
xxd
segmen output sendiri dengan baris baru di 60 hex-digit ... Opsi revert mengabaikan baris baru ini .. itu mengabaikan semua / semua baris baru (karena bukan hex-digit) ..sumber
bash
. Maksud saya "bash": menggunakan bahasa scripting bash; bukan python / perl dari dalam bash). Saya menambahkan ini sebagai jawaban karena mungkin ada nilainya bagi seseorang yang membaca halaman ini. Ini bagus satu-liner untuk seluruh file. Andaprintf
adalah jawaban terbaik untuk saya.Dengan asumsi pengkodean default untuk OS Anda adalah UTF-8 (berlaku untuk sebagian besar distro terkini) maka Anda dapat menggunakan bash secara langsung untuk mengonversi titik kode UNICODE:
Tentu saja, mesin terbang akan muncul dengan benar hanya jika Anda memiliki font yang benar. Pada bash 4.3 semua poin kode akan berfungsi dengan benar. Dan dua opsi bawaan ini juga akan berfungsi:
Perhatikan bahwa untuk bash 4.2 kode Unicode menunjuk dari
0x80
ke0xFF
dikodekan secara salah (bug bash). Untuk mengatasi masalah ini, Anda harus melihat program di situs ini (juga bagus untuk melihat lebih dalam tentang masalah konversi angka menjadi karakter.sumber
https://lists.gnu.org/archive/html/bug-bash/2012-02/msg00035.html
Deskripsi: \ u dan \ U salah mengkodekan nilai antara \ u80 dan \ uffMenggunakan substitusi Pola di bash versi 4.2 (dan lebih tinggi):
seperti yang dijelaskan di sini http://steve-parker.org/sh/tips/pattern-substitution/
sumber