diff --git a/ext/unicode/property.c b/ext/unicode/property.c index e322869e842..ed10bb93505 100644 --- a/ext/unicode/property.c +++ b/ext/unicode/property.c @@ -369,6 +369,35 @@ PHP_FUNCTION(char_from_digit) PHP_FUNCTION(char_from_name) { + UChar *name; + int name_len; + UChar32 ch; + UCharNameChoice choice = U_UNICODE_CHAR_NAME; + zend_bool extended = FALSE; + char *buf; + UErrorCode status = U_ZERO_ERROR; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "u|b", &name, &name_len, &extended) == FAILURE) { + return; + } + + if (extended) { + choice = U_EXTENDED_CHAR_NAME; + } + + buf = zend_unicode_to_ascii(name, name_len TSRMLS_CC); + if (buf) { + ch = u_charFromName(choice, buf, &status); + if (U_SUCCESS(status)) { + RETVAL_UCHAR32(ch); + } else { + RETVAL_FALSE; + } + } else { + php_error(E_WARNING, "Character name has to consist only of ASCII characters"); + RETURN_FALSE; + } + efree(buf); } PHP_FUNCTION(char_get_name)