Perl 如何使Term::Readline将UTF8标志设置为Readline的结果?

Perl 如何使Term::Readline将UTF8标志设置为Readline的结果?,perl,utf-8,readline,Perl,Utf 8,Readline,如何将UTF8标志设置为readline的结果 评论: 当我在启用mysql\u enable\u utf8的mysql数据库中搜索时: 为什么??这两个字符串是等价的。它就像0存储为IV,而不是存储为UV 嗯,您可能必须处理有缺陷的XS代码。如果是这种情况,可以使用utf8::upgrade$s和utf8::Degrade$s更改字符串在标量中的存储方式 与编码和解码不同,utf8::upgrade和utf8::Degrade不会更改字符串,只是更改其存储方式 $ perl -MDevel::

如何将UTF8标志设置为readline的结果

评论:

当我在启用mysql\u enable\u utf8的mysql数据库中搜索时:


为什么??这两个字符串是等价的。它就像0存储为IV,而不是存储为UV

嗯,您可能必须处理有缺陷的XS代码。如果是这种情况,可以使用utf8::upgrade$s和utf8::Degrade$s更改字符串在标量中的存储方式

与编码和解码不同,utf8::upgrade和utf8::Degrade不会更改字符串,只是更改其存储方式

$ 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

我在我的问题下面写了一条评论。啊,是的,许多DBD确实受到Unicode错误的困扰。假设Term::ReadLine已经解码,utf8::upgrade肯定是您想要的。
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
my $stmt = "SELECT * FROM $table WHERE City REGEXP ?";
say $stmt;

# my $term = Term::ReadLine->new( 'table_watch', *STDIN, *STDOUT );
# $term->ornaments( 0 ); 
# my $arg = $term->readline( 'Enter argument: ' ); # ü -> doesn't find 'München'

print "Enter argument: ";
my $arg = <>; # ü -> finds 'München'
chomp $arg;
$ 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