分类: PERL
2014-01-08 13:14:30
1.4.1问题描述
有时我们希望输出的是给定的字符所代表的的“数”,或者给定的“数”代表的字符
1.4.2 解决方案
使用ord 可以吧字符转换为数字,使用chr可以把数字转换为相应的字符
$num = ord($char);
$char = chr($num);
另外,在输出函数print和sprintf中使用参数%c也可以实现数到字符的转换:
$char = sprintf("%c", $num); # slower than chr($num)
$num=101;
printf("Number %d is character %c\n", $num, $num);
=>Number 101 is character e
模板C*和pack/unpack配合使用可以实现8-字节(ASCII)的转换,同样的U*可实现Unicode字符的转换:
$string=“history”;
@bytes = unpack("C*", $string);#104 105 115 116 111 114 121
$string = pack("C*", @bytes); #history
$unistr = pack("U4",0x24b6,0x24b7,0x24b8,0x24b9);
@unichars = unpack("U*", $unistr);
1.4.3 讨论
不像汇编语言之类的低级,无类型语言,Perl 认为数和字符是可以相互转换的。这就意味着我们不可以随便的对数和字符反复的赋值。Perl提供了chr 和ord 用来将数和字符进行相应的转换:
$value = ord("e"); # now 101
$character = chr(101); # now "e"
假如你已经有一个字符,它实际就是一个长度为1 的字符串。使用如果希望打印字符串,可以直接用print 或者带参数%s的printf或者sprintf函数,%c参数会强制printf和sprintf 将数字转换为字符,但当输出的字符是字符串的格式时,这就不适用了
printf("Number %d is character %c\n", 101, 101);
=>Number 101 is character e
pack, unpack, chr, 和 ord 这四个函数的运行速度都比sprintf快
@ascii_character_numbers = unpack("C*", "sample");
print "@ascii_character_numbers\n";
=>115 97 109 112 108 101
$word = pack("C*", @ascii_character_numbers);
$word = pack("C*", 115, 97, 109, 112, 108, 101); # same
print "$word\n";
=>sample
下面的例子将“HAL”转换为“IBM”
$hal = "HAL";
@byte = unpack("C*", $hal);
foreach $val (@byte) {
$val++; # add one to each byte value
}
$ibm = pack("C*", @byte);
print "$ibm\n"; # prints "IBM"
对于单字节字符数据例如无符号的ASCII 或者一些ISO8859 格式的字符,ord 函数的返回的值介于0到255之间,这和C语言的无符号字符型数据时一致的。、
另外Perl也集成了对Unicode码的支持。如果使用chr或sprint“%c”或pack “U” 返回的数值大于255,那么返回的数会是一个Unicode的字符串。
@unicode_points = unpack("U*", "fac\x{0327}ade");
print "@unicode_points\n";
102 97 99 807 97 100 101
$word = pack("U*", @unicode_points);
print "$word\n";
fa?ade
假如你需要的只是输出字符锁对应的值,你也可以不用unpack函数。Printf 和sprintf 函数有一个“v”修饰符:
printf "%vd\n", "fac\x{0327}ade";#102.97.99.807.97.100.101
printf "%vx\n", "fac\x{0327}ade";#66.61.63.327.61.64.65
每个字符对应的Unicode码值被“.” 分割
1.4.4 See Also
chr, ord, printf, sprintf, pack, 和 unpack 函数参见 perlfunc(1) 和Programming Perl的第29章