上下文:我们生成的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 a0
是UTF-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
我们在做什么错了?
?
)更新
由于某种原因,在服务器上,fr_FR
语言环境正在使用常规的不间断空间。而在另一台服务器上,相同的代码以使用狭窄的不间断空间的语言环境结尾。
各种工具对狭窄的不间断空间的支持似乎很差。
当前的解决方法是强制使用常规的不间断空间,并且最终可以正常工作。到目前为止,这并不理想。
如果有人能解释为什么相同的区域设置导致不同的分组符号,那么我将很高兴阅读它并学习如何在服务器之间获得一致的设置。