我怎样才能诱导Term :: Readline将UTF8标志设置为readline的结果?

时间:2013-01-15 10:36:05

标签: perl utf-8 readline

如何诱导Term::Readline将{1}}的结果设置为UTF8标志?

readline

输出:

#!/usr/local/bin/perl
use warnings FATAL => qw(all);
use strict;
use 5.10.1;
use utf8;
use open qw( :encoding(UTF-8) :std );
use Term::ReadLine;
use Devel::Peek;

my $term = Term::ReadLine->new( 'test', *STDIN, *STDOUT );
$term->ornaments( 0 );
my $char;

$char = $term->readline( 'Enter char: ' );
Dump $char;

print 'Enter char: ';
$char = <>;
chomp $char;
Dump $char;

注释:

当我在Enter char: ü SV = PV(0x11ce4c0) at 0x1090078 REFCNT = 1 FLAGS = (PADMY,POK,pPOK) PV = 0x14552c0 "\374"\0 CUR = 1 LEN = 16 Enter char: ü SV = PV(0x11ce4c0) at 0x1090078 REFCNT = 1 FLAGS = (PADMY,POK,pPOK,UTF8) PV = 0x14552c0 "\303\274"\0 [UTF8 "\x{fc}"] CUR = 2 LEN = 16 数据库中搜索时(启用mysql):

mysql_enable_utf8

1 个答案:

答案 0 :(得分:2)

为什么呢?这两个字符串是等价的。它像0一样存储为IV而存储为UV。

嗯,你可能需要处理有缺陷的XS代码。如果是这种情况,可以使用utf8::upgrade($s)utf8::downgrade($s)来更改字符串在标量中的存储方式。

与编码和解码不同,utf8::upgradeutf8::downgrade不会更改字符串,只会更改字符串的存储方式。

$ perl -MDevel::Peek -E'
   $_="\xFC";
   utf8::downgrade($d=$_); Dump($d);
   utf8::upgrade($u=$_);   Dump($u);
   say $d eq $u ?1:0;
'
SV = PV(0x86875c) at 0x4a9214
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0x8699b4 "\374"\0
  CUR = 1
  LEN = 12
SV = PV(0x868784) at 0x4a8f44
  REFCNT = 1
  FLAGS = (POK,pPOK,UTF8)
  PV = 0x869d14 "\303\274"\0 [UTF8 "\x{fc}"]
  CUR = 2
  LEN = 12
1