我在/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)
}
}
发布于 2018-06-25 05:30:12
关于你最初的问题:似乎没有这样的事情。但是,编码的代码已经更改,现在可以使用注册新编码并检查现有编码;这些列表也有可用编码。了。
还有一个函数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")»
相应的类现在已经记录下来了。
https://stackoverflow.com/questions/41433287
复制相似问题