perl 如何在Unicode格式之间转换:字符串、名称、数字

pes8fvy9  于 2022-11-15  发布在  Perl
关注(0)|答案(3)|浏览(176)

我最近更经常地使用unicode,想知道是否有一个命令行工具可以在unicode的形式之间转换。
要是能说一句就好了:

uni_convert "☃" --string

并且知道该字符串在Unicode中被定义为“SNOWMAN”。

8hhllhi2

8hhllhi21#

Perl的Unicode-Tussle发行版附带了有用的uniprops

$ uniprops '☃'
U+2603 ‹☃› \N{SNOWMAN}
...

$ uniprops 'U+2603'
U+2603 ‹☃› \N{SNOWMAN}
...

$ uniprops 'SNOWMAN'
U+2603 ‹☃› \N{SNOWMAN}
...

如果您正在编写代码,则需要charnames
| 需要|拥有|编码|
| - -|- -|- -|
| $code| $char| ord($char)|
| $code| $name| charnames::vianame($name)|
| $char| $code| chr($code)|
| $char| $name个|chr(charnames::vianame($name))|
| $name| $code| x1米15英寸|
| $name个|$char| charnames::viacode(ord($char))|
vianame接受正式别名(例如LINEFEEDLF)。如果要接受它,您需要自己解析U+表示法。($code = hex(s/^U\+//r);
示例:
第一次
其他资源:

提供对Unicode Character Database中的信息的访问。

uujelgoq

uujelgoq2#

这里有一个awk可以做到这一点。
从www.example.com下载this fileunicode.org,该网站提供最新的名称。
然后道:

q=$(printf '%x\n' \'☃)
awk '/^[[:xdigit:]]+/{
    str=$0
    sub(/^[[:xdigit:]]+[[:blank:]]+/,"",str)
    names[$1]=str
}
END{ print names[q] }
' q="$q" names.txt

印刷品:

SNOWMAN

如果你想走另一条路:

cp=$(awk '/^[[:xdigit:]]+/{
    str=$0
    sub(/^[[:xdigit:]]+[[:blank:]]+/,"",str)
    other_names[str]=$1
}
END{ print other_names[q] }
' q="SNOWMAN" names.txt)

echo -e "\u${cp}"

印刷品:

如果你有GNU awk,你可以很容易地将十六进制索引转换成十进制,并且可以从内部打印。这允许使用单个源文件,并通过定义qr来进行一种或另一种方式:

gawk '/^[[:xdigit:]]+/{
    str=$0
    sub(/^[[:xdigit:]]+[[:blank:]]+/,"",str)
    names[$1]=str
    other_names[str]=$1
}
END{ print q ? names[q] : sprintf("%c", strtonum("0x" other_names[r])) }
' r='SNOWMAN' names.txt
☃

gawk '/^[[:xdigit:]]+/{
    str=$0
    sub(/^[[:xdigit:]]+[[:blank:]]+/,"",str)
    names[$1]=str
    other_names[str]=$1
}
END{ print q ? names[q] : sprintf("%c", strtonum("0x" other_names[r])) }
' q=$(printf '%x\n' \'☃) names.txt
SNOWMAN
q3qa4bjr

q3qa4bjr3#

我将代码分离到一个文件中并创建了一个repo:https://github.com/poti1/uni_convert

相关问题