如何列印輸入字串的 Unicode 字形名稱?

如何列印輸入字串的 Unicode 字形名稱?

我希望能夠跑步

unicode-names 'abç'

並查看對應的 Unicode 字元名稱:

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

將字串列印為一系列 Unicode 字形名稱在多種情況下很有用:

  • 區分容易混淆的字符,例如“i”和“í”。
  • 解釋文字字串實際包含的內容(例如不可列印或未分配的零寬度字元)。

答案1

統一工具軟體包中有程式uniname

$ printf %s '…—' |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

答案2

我不知道從 中檢查這一點的好方法bash,但 Python 有一個內建的 Unicode 資料庫,您可以像在這樣的腳本中使用它:

#!/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)

您可以像這樣使用這個腳本(假設您呼叫了它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

資料庫ValueError會對它不知道的任何字元拋出異常,因此我們以十進位列印它們的程式碼點(通常這些是不可列印的字元)。

注意:此腳本假定您的終端機是 UTF-8 編碼的。如果不是,您應該更改該decode()方法的參數。 Python 支援非常廣泛的編碼選擇,您的編碼肯定會在其中。

答案3

我曾經u為此編寫過這個腳本:

#! /bin/sh -
exec perl -Mcharnames=full -Mopen=locale -lne '
  printf "U+%04X %s\n", ord($_), charnames::viacode(ord($_)) for /./g' -- "$@"

用作:

$ u <<< '棽'
U+0119 LATIN SMALL LETTER E WITH OGONEK
U+00A3 POUND SIGN
U+00BD VULGAR FRACTION ONE HALF

我也有這個openbox(我的視窗管理器)鍵綁定:

  <keybind key="W-J">
    <action name="Execute">
      <command>sh -c "notify-send -- \"$(xclip -o | perl -Mcharnames=:full -C -lne 'printf \"U+%04X %s\n\", $_, charnames::viacode($_) for map ord, /\P{ascii}/g')\""</command>
    </action>
  </keybind>

Windows+後J會發送通知,描述主要 X11 選擇中的非 ASCII 字符,您可能會發現這很有用。

相關內容