[编辑:事实证明,此问题的原始版本包含两个伪装成一个问题的不同问题。 (我在阅读并完成三重评论后才意识到这一点。)因此,我将原来的问题分成两部分。我编辑了这篇文章以包含我想出的问题,感谢tripleee的评论,并发布了第二个here。顺便说一句,第二篇文章包含了我在本文中描述的问题所带来的修复,即使用STDOUT
在脚本中明确设置binmode
的编码。]
我将使用下面的简短演示脚本来说明问题。
# -*- coding: utf-8 -*-
use strict;
use feature 'unicode_strings';
use POSIX 'locale_h';
use locale;
use utf8;
setlocale( LC_CTYPE, 'de_DE.UTF-8' );
my $non_ascii = 'ßäöüÄÖÜ';
print "$non_ascii\n";
my @non_ascii = split //, $non_ascii;
print "$_\n" for @non_ascii;
$DB::single = 1; 1; # return control to DB
(最后一行实际上是一个断点。)
好的,现在我在Perl调试器下运行它:
% perl -C -d dbtest.pl
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(dbtest.pl:8): setlocale( LC_CTYPE, 'de_DE.UTF-8' );
DB<1> c
ßäöüÄÖÜ
ß
ä
ö
ü
Ä
Ö
Ü
main::(dbtest.pl:17): $DB::single = 1; 1; # return control to DB
DB<1>
到目前为止一直很好:脚本产生了预期的输出,现在调试器已进入单步模式,正在等待输入。
如果我现在只使用R
重新启动调试器,然后再次运行脚本(使用c
,完全像以前一样),就会发生以下情况:
DB<1> R
Warning: some settings and command-line options may be lost!
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(dbtest.pl:8): setlocale( LC_CTYPE, 'de_DE.UTF-8' );
DB<1> c
\337\344\366\374\304\326\334
\337
\344
\366
\374
\304
\326
\334
main::(dbtest.pl:17): $DB::single = 1; 1; # return control to DB
DB<1>
此外,现在print
不再产生人类可读的输出:
DB<1> print $non_ascii
\337\344\366\374\304\326\334
如何在重启后保持输出看起来像人一样?