在网络服务器上,而不是在另一台服务器上,NumberFormatter输出是错误的

时间:2019-06-06 09:32:53

标签: php nginx unicode utf-8 windows-1252

上下文:我们生成的CSV和PDF文件包含使用法文格式设置的数字(千位分隔符是不间断的空格)。

当读取CSV或PDF文件时,从生产服务器下载时,我们得到一个?字符来代替不间断空格。从开发服务器下载后,我们将获得正确的文件。


我们有一个小的脚本,可帮助您最大限度地减少复制。

header('Content-Description: File Transfer');
header('Content-Type: text/plain; charset=UTF-8');
header('Content-Disposition: attachment; filename="'.date('YmdHis').'.txt"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

$fmt = new NumberFormatter('fr_FR', NumberFormatter::DECIMAL);
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);

echo $fmt->format(12390);

该脚本可在家用虚拟机上正常运行。

已下载文件的十六进制内容为

31 32 c2 a0 33 39 30 2c 30 30 

c2 a0UTF-8 no-break space

在生产服务器上运行时,完全相同的脚本会输出一个文件,其中包含以下十六进制内容:

31 32 e2 80 af 33 39 30 2c 30 30

e2 80 af是与上面的区别所在。这似乎是narrow no-break space character from Unicode, encoded in UTF-8

我们在做什么错了?

  • 我们试图比较PHP和Nginx配置,但是它们非常相似,找不到与编码有关的任何内容。
  • mbstring扩展在两侧均已启用。
  • 当我们注释标题以强制进行下载时,文本将由浏览器在两台服务器上正确显示(没有?

更新

由于某种原因,在服务器上,fr_FR语言环境正在使用常规的不间断空间。而在另一台服务器上,相同的代码以使用狭窄的不间断空间的语言环境结尾。

各种工具对狭窄的不间断空间的支持似乎很差。

当前的解决方法是强制使用常规的不间断空间,并且最终可以正常工作。到目前为止,这并不理想。

如果有人能解释为什么相同的区域设置导致不同的分组符号,那么我将很高兴阅读它并学习如何在服务器之间获得一致的设置。

0 个答案:

没有答案