【问题标题】:PHP gettext character encoding problems in windows versions of PHP 5.3 and greaterPHP 5.3 及更高版本的 Windows 版本中的 PHP gettext 字符编码问题
【发布时间】: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


    【解决方案1】:

    我无法让 Windows PHP 5.3.28 构建中的 gettext 功能正常工作,但有一个可能适合开发环境的解决方法。

    使用 runkit 扩展 (https://codeload.github.com/Crack/runkit-windows/zip/master) 你可以重新定义 _() 方法来调用 gettext 然后 utf8_decode 结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-24
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      相关资源
      最近更新 更多