【发布时间】:2019-10-08 02:19:54
【问题描述】:
我想记录作为参数剪切并粘贴到 bash 中的字符串的十六进制 unicode 代码点。 ord 不这样做; ord 似乎只能在 ascii 范围内工作。
我发现的关于 ord 的大部分内容至少有 6 年或更久,并且不再相关,因为我使用的是 v5.24,我读过它内置了 unicode 支持。 在 python 中这很简单:
for i in unicode(sys.argv[1], 'utf-8'):
print i.encode("utf_16_be").encode("hex")
这适用于 bash。 我认为问题在于 ord 函数本身,它似乎没有针对 unicode 更新。
# ord.pl does not provide the unicode code point for a pasted variable.
use strict;
use warnings;
#use charnames (); #nope.
#use feature 'unicode_strings'; #nope. Already automatically using as of v5.12.
#use utf8; #nope.
#binmode(STDOUT, ":encoding(UTF-8)"); #nope.
my $arg = "";
foreach $arg (@ARGV) {
print $arg . " is " . ord($arg) . " in code.\n"; # seems to me ord is ascii only.
#utf8::encode($arg); #nope.
#print unpack("H*", $arg) . "\n"; #nope.
#printf "%vX\n", $arg; #nope.
}
得到:
david@A8DT01:~/bin$ ord.pl A B C D a b c d \ \\ … — €
A is 65 in code.
41
B is 66 in code.
42
C is 67 in code.
43
D is 68 in code.
44
a is 97 in code.
61
b is 98 in code.
62
c is 99 in code.
63
d is 100 in code.
64
is 32 in code.
20
\ is 92 in code.
5c
… is 226 in code.
c3a2c280c2a6
— is 226 in code.
c3a2c280c294
is 239 in code.
c3afc280c2a8
€ is 226 in code.
c3a2c282c2ac
david@A8DT01:~/bin$
我想得到我在 python 中得到的输出:
david@A8DT01:~/bin$ python code-points.py "ABCDabcd \ … — €"
0041
0042
0043
0044
0061
0062
0063
0064
0020
005c
0020
2026
0020
2014
0020
f028
0020
20ac
david@A8DT01:~/bin$
【问题讨论】:
-
尝试使用选项
-CSDA运行您的脚本:即perl -CSDA ord.pl A B C D a b c d \ \\ … — €。它对我有用。