PHP PECL扩展intl给瑞典序号的乱码结果

问题描述:

我正在使用PECL intl模块在PHP项目中本地化日期和数字。在我使用的所有其他语言(40)中,本地化序数工作正常。然而在瑞典,我得到了奇怪的输出。它似乎是用来生成序数的模板常量。PHP PECL扩展intl给瑞典序号的乱码结果

$fnf = new NumberFormatter('sv_FI', NumberFormatter::ORDINAL); 
echo $fnf->format(1); 

$snf = new NumberFormatter('sv_SE', NumberFormatter::ORDINAL); 
echo $snf->format(1); 

两个返回1:e%digits-ordinal-neutre:0: 1:a与类似1st1er

我唯一的猜测,除了一个bug之外,就是我缺少一些额外的参数,例如关联动词的性别。

+0

听起来像一个bug,也许在pecl-dev邮件列表上提出问题http://pecl.php.net/support.php – quickshiftin 2011-12-30 01:15:01

+0

如果你告诉你正在使用的PHP版本和版本的模块。 – hakre 2011-12-30 10:58:02

+0

PHP 5.3.6-13ubuntu3.3与Suhosin-Patch,intl版本=> 1.1.0, ICU版本=> 4.4.2。 – Lucent 2011-12-30 21:12:47

如果输出基于数字格式化规则规则$fnf->getPattern()

%digits-ordinal-masculine: 
    0: =#,##0==%%dord-mascabbrev=; 
    -x: −>%digits-ordinal-masculine>; 
%%dord-mascabbrev: 
    0: :e%digits-ordinal-neutre:0: =%digits-ordinal-feminine=; 
%digits-ordinal-reale: 
    0: =%digits-ordinal-feminine=; 
%digits-ordinal-feminine: 
    0: =#,##0==%%dord-femabbrev=; 
    -x: −>%digits-ordinal-feminine>; 
%%dord-femabbrev: 
    0: :e; 
    1: :a; 
    2: :a; 
    3: :e; 
    20: >%%dord-femabbrev>; 
    100: >%%dord-femabbrev>; 
%digits-ordinal: 
    0: =%digits-ordinal-masculine=; 

你可以看到,私人规则集dord-mascabbrev只有一个规则,给予该值:

:e%digits-ordinal-neutre:0: 1:a 

,你将不得不然后在1之后输出,就像你在你的问题中描述的那样。

这不是PECL INTL中的错误,但其底层规则是格式错误的,它是ICU库(that rule there)的一部分。大约三年前,sv数字格式程序规则修复了缺少分号的问题,看起来像是一行代码滑过了。

这些规则从Unicode联合会的CLDR(Common Locale Data Repository,共同语言环境数据存储库)中提取到ICU中。我打开了一个bug report there,因为除非在CLDR中解决这个问题,然后放入ICU,否则它不能与PHP INTL扩展一起使用。

替代方法可能是手动修补ICU库(版本4.8),然后针对修补过的库构建PECL包。