【发布时间】:2016-01-12 00:06:11
【问题描述】:
我尝试将字符串转换为 utf8。
#!/usr/bin/perl -w
use Encode qw(encode decode is_utf8);
$str = "\320\300\304\310\323\321 \316\320\300\312\313";
Encode::from_to($str, 'windows-1251', 'utf-8');
print "converted:\n$str\n";
在这种情况下,我得到了我需要的东西:
# ./convert.pl
converted:
РАДИУС ОРАКЛ
但是如果我使用外部变量:
#!/usr/bin/perl -w
use Encode qw(encode decode is_utf8);
$str = $ARGV[0];
Encode::from_to($str, 'windows-1251', 'utf-8');
print "converted:\n$str\n";
什么都没有发生。
# ./convert.pl "\320\300\304\310\323\321 \316\320\300\312\313"
converted:
\320\300\304\310\323\321 \316\320\300\312\313
这是第一个示例的转储:
SV = PV(0x1dceb78) at 0x1ded120
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1de7970 "\320\300\304\310\323\321 \316\320\300\312\313"\0
CUR = 12
LEN = 16
第二个:
SV = PV(0x1c1db78) at 0x1c3c110
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1c5e7e0 "\\320\\300\\304\\310\\323\\321 \\316\\320\\300\\312\\313"\0
CUR = 45
LEN = 48
我试过这个方法:
#!/usr/bin/perl -w
use Devel::Peek;
$str = pack 'C*', map oct, $ARGV[0] =~ /\\(\d{3})/g;
print Dump ($str);
# ./convert.pl "\320\300\304\310\323\321 \316\320\300\312\313"
SV = PV(0x1c1db78) at 0x1c3c110
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x1c5e7e0 "\320\300\304\310\323\321\316\320\300\312\313"\0
CUR = 11
LEN = 48
但这又不是我需要的。你能帮我得到第一个脚本中的结果吗?
使用后
($str = shift) =~ s/\\([0-7]+)/chr oct $1/eg
按照鲍罗丁的建议,我明白了
SV = PVMG(0x13fa7f0) at 0x134d0f0
REFCNT =
FLAGS = (SMG,POK,pPOK)
IV = 0
NV = 0
PV = 0x1347970 "\320\300\304\310\323\321 \316\320\300\312\313"\0
CUR = 12
LEN = 16
MAGIC = 0x1358290
MG_VIRTUAL = &PL_vtbl_mglob
MG_TYPE = PERL_MAGIC_regex_global(g)
MG_LEN = -1
【问题讨论】:
-
您的输入格式到底是什么?除了反斜杠+八进制数之外,它可以包含任何特殊序列吗?
-
当您
pack时,您必须逃脱逃脱。输入应该是"\\320\\300\\304\\310\\323\\321 \\316\\320\\300\\312\\313"另外如果你想要空格,你需要使用八进制空格char(040),"\\320\\300\\304\\310\\323\\321\\040\\316\\320\\300\\312\\313" -
你说你的第三个例子是 "not what I need" 但字符串与你说的第一个例子是相同的,除了你删除了空格。它到底有什么问题?
-
这行得通吗?
($str = shift) =~ s/\\([0-7]+)/chr oct $1/eg -
@melpomene 输入格式为 utf-8 字符串,但该字符串包含来自Windows-1251 table的符号
标签: perl encoding utf-8 cp1251