我在 /src/core/Rakudo/Internals.pm 中看到一个带有简短编码列表的哈希,但没有办法在它之外找到它。 NORMALIZE_ENCODING
方法是唯一使用它的方法。使用不在此列表中的内容,您将获得例外。
那么,在尝试之前我怎么知道它有效,特别是因为缺少一些重要的编码?
my $encodings := nqp::hash(
# fast mapping for identicals
'utf8', 'utf8',
'utf16', 'utf16',
'utf32', 'utf32',
'ascii', 'ascii',
'iso-8859-1', 'iso-8859-1',
'windows-1252', 'windows-1252',
# with dash
'utf-8', 'utf8',
'utf-16', 'utf16',
'utf-32', 'utf32',
# according to http://de.wikipedia.org/wiki/ISO-8859-1
'iso_8859-1:1987', 'iso-8859-1',
'iso_8859-1', 'iso-8859-1',
'iso-ir-100', 'iso-8859-1',
'latin1', 'iso-8859-1',
'latin-1', 'iso-8859-1',
'csisolatin1', 'iso-8859-1',
'l1', 'iso-8859-1',
'ibm819', 'iso-8859-1',
'cp819', 'iso-8859-1',
);
method NORMALIZE_ENCODING(Str:D \encoding) {
my str $key = nqp::unbox_s(encoding);
if nqp::existskey($encodings,$key) {
nqp::atkey($encodings,$key)
}
else {
my str $lc = nqp::lc($key);
nqp::existskey($encodings,$lc)
?? nqp::atkey($encodings,$lc)
!! nqp::lc($key)
}
}
答案 0 :(得分:-1)
关于您最初的问题:似乎没有这样的事情。但是,编码代码已更改,现在您可以register new encodings and check existing ones; those lines also available encodings。
还有一个find
函数,如果存在则返回一个编码对象:
say Encoding::Registry.find('oh-no');
# OUTPUT: «(exit code 1) Unknown string encoding 'oh-no'»
say Encoding::Registry.find('latin1');
#OUTPUT: «Encoding::Builtin.new(name => "iso-8859-1")»
但是,没有记录 Encoding::Registry
,而只是将其命名为Encoding
角色的一部分。我已经注册this issue进行记录。