Chinaunix首页 | 论坛 | 博客
  • 博客访问: 25704
  • 博文数量: 13
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 130
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-05 16:13
文章分类
文章存档

2016年(1)

2014年(12)

我的朋友

分类: PERL

2014-01-08 13:14:30

1.4.1问题描述

有时我们希望输出的是给定的字符所代表的的“数”,或者给定的“数”代表的字符

1.4.2 解决方案

使用ord 可以吧字符转换为数字,使用chr可以把数字转换为相应的字符

$num  = ord($char);

$char = chr($num);

另外,在输出函数printsprintf中使用参数%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 或者带参数%sprintf或者sprintf函数,%c参数会强制printfsprintf 将数字转换为字符,但当输出的字符是字符串的格式时,这就不适用了

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 函数的返回的值介于0255之间,这和C语言的无符号字符型数据时一致的。、

另外Perl也集成了对Unicode码的支持。如果使用chrsprint%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章 

阅读(562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~