Bagaimana cara mencetak nama mesin terbang Unicode untuk string input?

12

Saya ingin bisa berlari

unicode-names 'abç'

dan lihat nama karakter Unicode yang sesuai:

LATIN SMALL LETTER A
LATIN SMALL LETTER B
LATIN SMALL LETTER C WITH CEDILLA

Mencetak string sebagai serangkaian nama mesin terbang Unicode akan berguna dalam beberapa kasus:

  • Bedakan karakter yang mudah bingung seperti "i" dan "í".
  • Jelaskan apa yang sebenarnya berisi string literal (misalnya karakter tanpa lebar yang tidak dapat dicetak atau tidak ditugaskan).
l0b0
sumber

Jawaban:

14

The uniutils paket memiliki program uniname.

$ echo -n …—|uniname
character  byte       UTF-32   encoded as     glyph   name
    0          0  002026   E2 80 A6       …      HORIZONTAL ELLIPSIS
    1          3  002014   E2 80 94       —      EM DASH
donasi berhasil
sumber
1
Untuk hasil minimal dengan hanya nama-nama, gunakan opsi ini:echo -n …— | uniname -bcegpu
l0b0
8

Saya tidak tahu cara yang baik untuk memeriksanya bash, tetapi Python memiliki basis data Unicode bawaan yang dapat Anda gunakan seperti pada skrip seperti ini:

#!/usr/bin/env python
import sys, unicodedata
for ch in sys.stdin.read().decode('utf-8'):
  try:
    print unicodedata.name(ch)
  except ValueError:
    print 'codepoint ', ord(ch)

Anda dapat menggunakan skrip ini seperti ini (dengan asumsi Anda menyebutnya unicode-names):

$ echo 'abc©áοπρσ' | unicode-names
LATIN SMALL LETTER A
LATIN SMALL LETTER B
LATIN SMALL LETTER C
COPYRIGHT SIGN
LATIN SMALL LETTER A WITH ACUTE
GREEK SMALL LETTER OMICRON
GREEK SMALL LETTER PI
GREEK SMALL LETTER RHO
GREEK SMALL LETTER SIGMA
codepoint 10

Basis data mengeluarkan ValueErrorpengecualian untuk karakter apa pun yang tidak diketahuinya, jadi kami mencetak titik kode dalam desimal (biasanya ini adalah karakter yang tidak dapat dicetak).

Peringatan: skrip mengasumsikan terminal Anda dikodekan UTF-8. Jika tidak, Anda harus mengubah argumen decode()metode ini. Python mendukung pilihan pengkodean yang sangat luas, milik Anda pasti ada di sana.

Alexios
sumber
1
Penggunaan yang lebih baik sys.getdefaultencoding().
Chris Down