【发布时间】:2014-05-07 10:53:06
【问题描述】:
我们正在从 PHP 5.2 迁移到 PHP 5.3,并且在 PHP 5.3 以上的 Windows 版本中遇到了 gettext 问题。 gettext 似乎以 UTF-8 格式返回数据,当我们尝试更改字符集时,对 bind_textdomain_codeset() 的调用无效。
请参阅以下脚本:
<?php
print 'PHP_OS: ' . PHP_OS . "\n";
print 'php_version: ' . phpversion() . "\n\n";
$language = 'de_DE';
putenv( "LANG=$language" );
setlocale( LC_ALL, $language );
if ( strtoupper( substr( PHP_OS, 0, 3 ) ) === 'WIN' ) {
$language = 'german';
setlocale( LC_ALL, $language );
}
bindtextdomain( 'messages', dirname(__FILE__) . '/language' );
textdomain( 'messages' );
$translated = _( 'Overtime' );
printf ("Default encoding: %X %X\n", ord($translated[0]), ord($translated[1]));
bind_textdomain_codeset('messages', 'ISO-8859-1');
$translated = _( 'Overtime' );
printf ("Encoding set to ISO-8859-1: %X %X\n", ord($translated[0]), ord($translated[1]));
bind_textdomain_codeset('messages', 'UTF-8');
$translated = _( 'Overtime' );
printf ("Encoding set to UTF-8: %X %X\n", ord($translated[0]), ord($translated[1]));
语言文件的本地目录结构:
language
de
LC_MESSAGES
messages.mo
messages.mo 包含一条将“Overtime”翻译为“Überstunden”的消息
windows 下 PHP5.2.9-2 和 Linux 下 PHP5.3.27 的结果与预期一致(0xDC 是带有变音符号的 ISO-8859-1 U,0x62 是 ISO-8859-1 b,0xC39C 是带有变音符号的 UTF-8 U )
PHP_OS: WINNT
php_version: 5.2.9-2
Default encoding: DC 62
Encoding set to ISO-8859-1: DC 62
Encoding set to UTF-8: C3 9C
---------------------------------
PHP_OS: Linux
php_version: 5.3.27
Default encoding: DC 62
Encoding set to ISO-8859-1: DC 62
Encoding set to UTF-8: C3 9C
但是在 windows 版本的 PHP 5.3 下(也用 5.4 测试过),结果不如预期:
PHP_OS: WINNT
php_version: 5.3.28
Default encoding: C3 9C
Encoding set to ISO-8859-1: C3 9C
Encoding set to UTF-8: C3 9C
默认输出为 UTF-8,不能通过 bind_textdomain_codeset 更改。
我们目前在整个应用程序中使用 gettext 和 ISO-8859-1,并希望在 Windows 下运行单元测试,但 PHP 5.3 及更高版本的 Windows 版本在 gettext 返回的编码方面似乎被破坏了。
【问题讨论】:
标签: php encoding utf-8 gettext iso-8859-1