Bug #75574 [Opn]: putenv does not work properly if parameter contains non-ASCII unicode character
| From: | ganlvtech at qq dot com | Date: | Mon, 27 Nov 2017 04:15:19 +0000 |
| Subject: | Bug #75574 [Opn]: putenv does not work properly if parameter contains non-ASCII unicode character | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-212734@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=75574&edit=1
ID: 75574
User updated by: ganlvtech at qq dot com
Reported by: ganlvtech at qq dot com
Summary: putenv does not work properly if parameter contains
non-ASCII unicode character
Status: Open
Type: Bug
Package: Scripting Engine problem
Operating System: Windows 10 (1709) zh-CN
PHP Version: 7.1.12 nts Win32 VC14 x64
Block user comment: N
Private report: N
New Comment:
https://stackoverflow.com/questions/19008182/c11-and-win32-wchar-t
if php uses SetEnvironmentVariableA now, it can convert UTF8 to UTF16 and use
SetEnvironmentVariableW.
I don't know if this is a solution of this problem.
Previous Comments:
------------------------------------------------------------------------
[2017-11-27 03:56:00] ganlvtech at qq dot com
Oh, if I change the encoding of the test script from UTF-8 to GBK (from 3 bytes per char to 2 bytes
per char), it will be OK.
I don't know if there is any settings wrong with my Windows (Chinese simplyfied version). It
seems that the system only accept non-ASCII char in 2 bytes (in another word, system use GBK
encoding). System accept & return the value in GBK encoding, but php pass & retrieve env var
in UTF-8 encoding.
I set an Environment variable in control panel, and retrieve the value in php by getenv. I got an
GBK encoding byte string cannot read. Because php7 use UTF-8 as default ouput encoding. I tried
echo iconv('GBK', 'UTF-8', getenv('FOO'));
and got the expected value.
I think this bug may be the limitation of Windows platform, and may not be fixed unless Windows
change the its default encoding to Unicode.
Thanks.
Another test script:
---------------
// Greek_alphabet 'α' === urldecode('%CE%B1')
var_dump(putenv('FOO=α')); // true
php.ini:
---------------
; PHP's default character set is set to UTF-8.
; http://php.net/default-charset
default_charset = "UTF-8"
; PHP internal character encoding is set to empty.
; If empty, default_charset is used.
; http://php.net/internal-encoding
;internal_encoding =
PHP Version: php-7.1.12-nts-Win32-VC14-x64
------------------------------------------------------------------------
[2017-11-26 21:07:32] ab@php.net
Ah, and the encoding of the file you've posted, too.
Thanks.
------------------------------------------------------------------------
[2017-11-26 21:04:14] ab@php.net
Thanks for the report. Could you also tell whether your build is TS/NTS and what is your INI for
default_charset and internal_encoding?
Thanks.
------------------------------------------------------------------------
[2017-11-26 19:14:50] ganlvtech at qq dot com
Description:
------------
If the value ends with odd numbers of Chinese characters, it returns false and getenv cannot get the
environment variable just set.
If the value ends with even numbers of Chinese characters, it works well and returns true.
If the value ends with a ASCII character, although there are some Chinese characters in the string,
it still works well.
If the Chinese characters is split by ASCII character, only the number of the last part of Chinese
characters affects the result.
Japanese character also cause this problem.
On ubuntu 16.04.3 with php 7.0.22 everything is OK. So the bug may be only for Windows.
I have checked the php-src/ext/standard/basic_functions.c PHP_FUNCTION(putenv), but I'm sorry
that I cannot find the solution.
This problem might be similar to the fixed bug #50690(putenv() does not assign values to env. vars
when the value is one character), but this one is for non-ASCII character.
Thank you.
Test script:
---------------
<?php
// Chinese character 'å' === urldecode('%E5%95%8A')
var_dump(putenv('FOO=å')); // false
// var_dump(putenv('FOO=' . urldecode('%E5%95%8A'))); // false
var_dump(putenv('FOO=åå')); // true
// var_dump(putenv('FOO=' . urldecode('%E5%95%8A%E5%95%8A'))); // true
var_dump(putenv('FOO=ååå')); // false
var_dump(putenv('FOO=åååå')); // true
// odd got false, even got true.
var_dump(putenv('FOO=åa')); // true
var_dump(putenv('FOO=åaå')); // false
var_dump(putenv('FOO=åaåa')); // true
var_dump(putenv('FOO=åaåaå')); // false
var_dump(putenv('FOO=åaåå')); // true
var_dump(putenv('FOO=åaååå')); // false
var_dump(putenv('FOO=åaåååå')); // true
// If the value ends with odd numbers of Chinese character, it returns false.
?>
Expected result:
----------------
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
bool(true)
Actual result:
--------------
bool(false)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=75574&edit=1