在有人告诉我 RTFM 之前,我必须说 - 我已经深入研究了:
- 为什么现代 Perl 默认避免使用 UTF-8?
- 使用 Perl 采用 Unicode 方式的清单
- 如何在perl中将字符串与变音符号匹配?
- 如何使用现代 perl 和 utf8 默认值“使用 My::defaults”?
- 和许多其他人(例如perluniintro和其他人)-但是-当然,错过了一些东西
所以,基本代码:
use 5.014; #getting 'unicode_strings' feature
use uni::perl; #turning on many utf8 things
use Unicode::Normalize qw(NFD NFC);
use warnings;
while(<>) {
chomp;
my $data = NFD($_);
say "OK" if utf8::is_utf8($data);
}
此时,从utf8编码的STDIN 我得到了一个正确的unicode字符串$data
,例如“\w”将匹配多字节[\p{Alphabetic}\p{Decimal_Number}\p{Letter_Number}]
(可能更多)。没关系并且有效。
AFAIK$data
不包含 utf8,而是格式的字符串perl's internal Unicode
。
现在的问题:
- 我如何确保(测试)任何
$other_data
包含有效的 Unicode 字符串? - utf8::is_utf8($data) 的目的是什么?整个utf8 pragma 对我来说是个谜。
我知道这use utf8;
只是为了告诉 Perl 我的源代码在 utf8 中(所以当我的脚本以 BOM 标志开头时做类似的事情 - 对于 BigEndian) - 从 Perl 的角度来看,我的源代码就像一个外部文件 - Perl 应该知道它是什么编码......
在上面的示例utf8::is_utf8($data)
中将打印 OK - 但我不明白为什么。
Perl 内部不使用 utf8,所以我的 utf8 数据文件被转换为 Perl 内部的 Unicode,那么为什么返回utf8::is_utf8($data)
true$data
不是utf8 格式?或者是命名错误,函数应该命名为 uni::is_unicode($data)???
提前感谢您的澄清。
Ps:@brian d foy - 是的,我仍然没有有效的 Perl 编程书 - 我会得到它 - 我保证 :) /joking/