入力文字列の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

でこれを確認する良い方法はわかりませんが、bashPythonには次のスクリプトで使用できる組み込みの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未知の文字に対して例外をスローするため、コードポイントを10進数で印刷します(通常は印刷できない文字です)。

注:このスクリプトは、端末がUTF-8でエンコードされていると想定しています。それ以外の場合は、メソッドのパラメータを変更する必要がありますdecode()。 Pythonは非常に多様なエンコーディングをサポートし、あなたのエンコーディングも明らかにそれらの1つです。

答え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以外の文字を説明する通知が送信されます。これは便利です。

関連情報