string - (看似)相同的字符串以不同方式转换为大写

标签 string perl uppercase

我在将两个“相同”字符串转换为大写时遇到了一个非常奇怪的问题。该程序正在从网站读取行并将其与存储在文本文件中的行进行比较。如果未找到该行,则将其添加到文件末尾。除非该行包含特殊字符,否则这非常有效。由于某种原因,比较结果不匹配。我通过首先将它们转换为大写来比较这两个字符串,这就是它出错的地方。下面是一些代码。我省略了填充两个变量的部分。我只是展示了奇怪的部分。

print "$pageLine <-> $dbLine\n";
print uc( $pageLine ) . " <-> " . uc( $dbLine ) . "\n";

这导致

Diëtisten <-> Diëtisten
DIëTISTEN <-> DIËTISTEN

请注意,第一个中的 ë 未转换为大写。

foreach my $kar (split( //, $pageLine) ) {
  print ord($kar) . ":";
}
print "\n";
foreach my $kar (split( //, $dbLine) ) {
  print ord($kar) . ":";
}
print "\n";

这导致:

68:105:235:116:105:115:116:101:110:32:40:78:86:68:41:
68:105:235:116:105:115:116:101:110:32:40:78:86:68:41:

有人知道这里发生了什么吗?

提前致谢。

最佳答案

最小演示:

my $s = "\xEB";
utf8::downgrade( my $d = $s );
utf8::upgrade(   my $u = $s );
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different";
$_ = uc($_) for $d, $u;
printf "%vX %vX %s\n", $d, $u, $d eq $u ? "same" : "different";

输出:

EB EB same
EB CB different

默认情况下,为了向后兼容,如果输入标量的 UTF8 标志关闭,uc 将仅大写 ASCII 字符。它是 Unicode Bug[1] 的一个实例,已通过添加以下内容修复:

use feature qw( unicode_strings );

可以通过添加以下内容间接完成上述操作:

use 5.012;

引用文献:unicode_strings , feature , use


  1. 当代码的行为取决于字符串的存储格式时,该代码就被称为 Unicode Bug。

关于string - (看似)相同的字符串以不同方式转换为大写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42909066/

相关文章:

javascript - 在 Javascript 中查找字符串的所有小写和大写组合

javascript - 使用正则表达式匹配具有两个此类子字符串的字符串中的第一个子字符串,默认情况下通常匹配最后一个子字符串

c - 添加重复调用函数

Perl DBI 连接有效但不适用于 Catalyst

mysql - 使用perl将特殊字符插入mysql

python - 从相对路径确定绝对路径

Java - 在不使用 toUppercase() 的情况下将小写字母转换为大写字母

android - 如何将大写字母转换为小写字母?

mysql - 在 ComboBox.Item 中隐藏部分 String.Format

java - 如何用随机字符串填充二维数组