如何在perl中转储字符串以查看是否存在字符差异?

如何在perl中转储字符串以查看是否存在字符差异?,perl,unicode,encoding,character-encoding,dump,Perl,Unicode,Encoding,Character Encoding,Dump,我偶尔会遇到字符串细微差别的问题,在某些情况下会改变行为,所以我认为细微差别是unicode的。我希望以这样一种方式转储字符串,以使差异对我来说是可见的。我可以选择哪些选项来执行此操作?我建议在以下位置使用Dump功能: (您可以在第二个示例中看到FLAGS如何包含UTF8,因为第一个示例中没有宽字符?对于大多数使用,使用Useqq即可 use utf8; use Data::Dumper; local $Data::Dumper::Useqq = 1; print(Dumper("foo–ba

我偶尔会遇到字符串细微差别的问题,在某些情况下会改变行为,所以我认为细微差别是unicode的。我希望以这样一种方式转储字符串,以使差异对我来说是可见的。我可以选择哪些选项来执行此操作?

我建议在以下位置使用
Dump
功能:

(您可以在第二个示例中看到
FLAGS
如何包含
UTF8
,因为第一个示例中没有宽字符?

对于大多数使用,使用
Useqq
即可

use utf8;
use Data::Dumper;
local $Data::Dumper::Useqq = 1;
print(Dumper("foo–bar"));
print(Dumper("foo-bar"));
输出:

$VAR1 = "foo\x{2013}bar";
$VAR1 = "foo-bar";
SV = PV(0x328ccc) at 0x1d6a0c4
  REFCNT = 1
  FLAGS = (PADTMP,POK,READONLY,pPOK,UTF8)
  PV = 0x1d6d52c "foo\342\200\223bar"\0 [UTF8 "foo\x{2013}bar"]
  CUR = 9
  LEN = 12
SV = PV(0x328dcc) at 0x32b594
  REFCNT = 1
  FLAGS = (PADTMP,POK,READONLY,pPOK)
  PV = 0x1d6d50c "foo-bar"\0
  CUR = 7
  LEN = 12
如果需要内部详细信息(如UTF8标志),请使用

输出:

$VAR1 = "foo\x{2013}bar";
$VAR1 = "foo-bar";
SV = PV(0x328ccc) at 0x1d6a0c4
  REFCNT = 1
  FLAGS = (PADTMP,POK,READONLY,pPOK,UTF8)
  PV = 0x1d6d52c "foo\342\200\223bar"\0 [UTF8 "foo\x{2013}bar"]
  CUR = 9
  LEN = 12
SV = PV(0x328dcc) at 0x32b594
  REFCNT = 1
  FLAGS = (PADTMP,POK,READONLY,pPOK)
  PV = 0x1d6d50c "foo-bar"\0
  CUR = 7
  LEN = 12

转储任何字符串所需的全部内容是:

printf "U+%v04X\n", $string;
您可以使用此设置字符串的格式:

($print_string = $string) =~ s/([^\x20-\x7E])/sprintf "\\x{%x}", $1/ge;
甚至

use charnames ();
($print_string = $string) =~ s/([^\x20-\x7E])/sprintf "\\N{%s}", charnames::viacode(ord $1)/ge;
我不知道为什么在世界上你会使用名称错误的
utf8::all
。它不是一个核心模块,您似乎在了解它真正在做什么方面遇到了一些麻烦。如果你明确地使用了其中的各个核心部分,也许你会更好地理解它。

你试过了吗?尽管它实际上是一个测试模块,但它可以方便地向您显示字符串中的差异出现的位置。它关注于不同的部分,而不是显示整个字符串,并且它使
\x{}
对特殊项进行转义


我想看一个例子,其中
utf8::all
改变了行为,即使只是为了看一个有趣的边缘案例。

我以前从未想到我的问题发生在哪里,甚至是如何发生的。在不同的地方,有各种各样的魔术蒙骗我的作品,例如dancer插件数据库打开utf8,我所知道的是,我在A点输入'foo',得到sha X,我在B点输入它,得到sha Y,始终如一。我将utf8::all添加到模块中,问题就消失了。我不喜欢完全不理解它。它涉及密码散列和数据库。这一点都不好玩,我也不知道为什么。否则我会的。注意:我之前不确定它是否是utf8::所有,但这似乎是我的问题Devel::Peek可以工作其他事情没有完成,因为字符串中实际上没有特殊字符,但utf8标志在那里。Devel::Peek超链接已断开。可能是吗?@Nagev,修复了链接