在PERL里,怎么把十六进制字符串转化成UNICODE字符串?

时间:2023-01-07 10:12:50
简单的说,就是:
一个字符串"8E7F3D4EB065164E4C75",这是"美丽新世界"的UNICODE的16进制码,要把这个字符串还原成UNICODE的“美丽新世界”,应该怎么做?

(这个不是UTF8编码的。)

搞了半天,也没想出办法。。。兄弟们帮个忙吧!

6 个解决方案

#1


在这个版搜索下吧,以前发过很多类似的贴子了。我记得上个月还回过一个。

#2


就是找了很久没找到才问的。兄弟明示吧。。。
$Str=~s/([0-9a-fA-F]{4})/pack("I",hex($1))/eg;
$Str=Encode::decode("UCS-2BE",$Str);
print $Str,"\n";

这样写的话,可以在KOMODO中看到,输出了“\x00美\x00丽\x00新\x00世\x”
不仅多出了\x00,而且,少了一个字。。。

#3


Dumper的结果是:$VAR1 = "\x{7f8e}\x00\x{4e3d}\x00\x{65b0}\x00\x{4e16}\x00\x{754c}\x00";

#4


use strict;
use Encode;
use Data::Dumper;
my $Str="8E7F3D4EB065164E4C75";
binmode(STDOUT, ":encoding(gb2312)");
$Str=~s/([0-9a-fA-F]{4})/pack("I",hex($1))/eg;
$Str=Encode::decode("UCS-2BE",$Str);
$Str=~s/\x{00}//g;
print $Str,"\n";

得,不管怎么说。。。。这个代码最终输出了“美丽新世界”,死心了

#5


use Encode qw(from_to);

my $hex = '8E7F3D4EB065164E4C75'; # 原始16进制字符串
my $unicode = pack('H*', $hex);   # 换成换成unicode-16编码的字符串。

my $gbk = $unicode;
from_to($gbk, 'utf-16le', 'gbk'); # 转换成本地编码,这里假设gbk是本地编码
print "$gbk\n";

#6


谢了!

#1


在这个版搜索下吧,以前发过很多类似的贴子了。我记得上个月还回过一个。

#2


就是找了很久没找到才问的。兄弟明示吧。。。
$Str=~s/([0-9a-fA-F]{4})/pack("I",hex($1))/eg;
$Str=Encode::decode("UCS-2BE",$Str);
print $Str,"\n";

这样写的话,可以在KOMODO中看到,输出了“\x00美\x00丽\x00新\x00世\x”
不仅多出了\x00,而且,少了一个字。。。

#3


Dumper的结果是:$VAR1 = "\x{7f8e}\x00\x{4e3d}\x00\x{65b0}\x00\x{4e16}\x00\x{754c}\x00";

#4


use strict;
use Encode;
use Data::Dumper;
my $Str="8E7F3D4EB065164E4C75";
binmode(STDOUT, ":encoding(gb2312)");
$Str=~s/([0-9a-fA-F]{4})/pack("I",hex($1))/eg;
$Str=Encode::decode("UCS-2BE",$Str);
$Str=~s/\x{00}//g;
print $Str,"\n";

得,不管怎么说。。。。这个代码最终输出了“美丽新世界”,死心了

#5


use Encode qw(from_to);

my $hex = '8E7F3D4EB065164E4C75'; # 原始16进制字符串
my $unicode = pack('H*', $hex);   # 换成换成unicode-16编码的字符串。

my $gbk = $unicode;
from_to($gbk, 'utf-16le', 'gbk'); # 转换成本地编码,这里假设gbk是本地编码
print "$gbk\n";

#6


谢了!