我最近更頻繁地使用 unicode,想知道是否有命令列工具可以在其形式之間轉換 unicode。
很高興能夠說:
uni_convert "?" --string
并且知道該字串在 unicode 中定義為“SNOWMAN”。
uj5u.com熱心網友回復:
Perl 的Unicode-Tussle發行版帶有有用的uniprops.
$ uniprops '?'
U 2603 ??? \N{SNOWMAN}
...
$ uniprops 'U 2603'
U 2603 ??? \N{SNOWMAN}
...
$ uniprops 'SNOWMAN'
U 2603 ??? \N{SNOWMAN}
...
如果您正在撰寫代碼,則需要charnames。
Input Want $code Want $char Want $name
----- ------------------------------ ------------------------------ ------------------------------
$code ord($code) charnames::viacode($code)
----- ------------------------------ ------------------------------ ------------------------------
$char ord($char) charnames::viacode(ord($char))
----- ------------------------------ ------------------------------ ------------------------------
$name charnames::vianame($name) chr(charnames::vianame($name))
----- ------------------------------ ------------------------------ ------------------------------
vianame接受官方別名(例如LFfor LINEFEED)。U 如果希望接受它,您需要自己決議符號。( $code = hex(s/^U\ //r);)
例子:
use strict;
use warnings;
use feature qw( say );
use experimental qw( regex_sets );
use utf8; # Source encoded using UTF-8.
use open ":std", ":encoding(UTF-8)"; # Terminal provides/expects UTF-8.
use charnames qw( :full );
use Encode qw( decode_utf8 );
@ARGV == 1
or die("usage\n");
my $s = decode_utf8($ARGV[0]);
for my $cp ( unpack "W*", $s ) {
my $ch = chr($cp);
if ( $ch =~ /(?[ \p{Print} - \p{Mark} ])/ ) { # Not sure if good enough.
printf "?%s? ", $ch;
} else {
print "--- ";
}
printf "U %X ", $cp;
say charnames::viacode($cp);
}
$ uni_id ?
??? U 2603 SNOWMAN
$ uni_id ?à
??? U E7 LATIN SMALL LETTER C WITH CEDILLA
?à? U E0 LATIN SMALL LETTER A WITH GRAVE
其他資源:
Unicode::UCD
提供對Unicode 字符資料庫中資訊的訪問。
在Unicode標準是比文字和屬性更多。
鏡面螺旋槳
unichars來自Unicode-Tussle(例如unichars '\p{Hiragana}')
uj5u.com熱心網友回復:
這是一個 awk 來做到這一點。
從提供最新名稱的 unicode.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,您可以輕松地將十六進制索引轉換為十進制并可以從內部列印。這允許使用單個源檔案并通過定義qor以一種或另一種方式進行r:
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
uj5u.com熱心網友回復:
我將代碼分成一個檔案并創建了一個 repo:https : //github.com/poti1/uni_convert
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/379128.html
