diff --git a/ext/standard/tests/url/url_utf8.phpt b/ext/standard/tests/url/url_utf8.phpt new file mode 100644 index 0000000000000..297cb18cc41a8 --- /dev/null +++ b/ext/standard/tests/url/url_utf8.phpt @@ -0,0 +1,10 @@ +--TEST-- +Uri: hostnames should be preserved in Unicode form +--FILE-- + +--EXPECT-- +string(24) "ουτοπία.δπθ.gr" \ No newline at end of file diff --git a/ext/standard/url.c b/ext/standard/url.c index d19965fb2081c..b80cb16ad7a61 100644 --- a/ext/standard/url.c +++ b/ext/standard/url.c @@ -18,6 +18,12 @@ #include #include #include +#if defined(__APPLE__) +#include +#endif +#if defined(__APPLE__) +#include +#endif #include "php.h" @@ -58,6 +64,24 @@ 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;