Skip to content
Closed
10 changes: 10 additions & 0 deletions ext/standard/tests/url/url_utf8.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
--TEST--
Uri: hostnames should be preserved in Unicode form
--FILE--
<?php

$parsed = parse_url('http://ουτοπία.δπθ.gr/');
var_dump($parsed['host']);
?>
--EXPECT--
string(24) "ουτοπία.δπθ.gr"
25 changes: 24 additions & 1 deletion ext/standard/url.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#if defined(__APPLE__)
#include <wchar.h>
#endif
#if defined(__APPLE__)
#include <wctype.h>
#endif

#include "php.h"

Expand Down Expand Up @@ -58,6 +64,23 @@ static void parse_url_free_uri(void *uri)

static void php_replace_controlchars(char *str, size_t len)
{
#if defined(__APPLE__)
{
ZEND_ASSERT(str != NULL);
wchar_t wbuf[len];
memset(wbuf, 0, sizeof(wbuf));
size_t wlen = mbstowcs(wbuf, str, len);

for (size_t i = 0; i < wlen; i++) {
if (iswcntrl(wbuf[i])) {
wbuf[i] = L'_';
}
}

wcstombs(str, wbuf, len);
return;
}
#endif
unsigned char *s = (unsigned char *)str;
unsigned char *e = (unsigned char *)str + len;

Expand Down Expand Up @@ -925,4 +948,4 @@ PHP_FUNCTION(get_headers)
PHP_MINIT_FUNCTION(url)
{
return php_uri_handler_register(&parse_url_uri_handler);
}
}