mirror of
https://github.com/php/php-src.git
synced 2025-08-18 15:08:55 +02:00
Fixup config.w32.
Implement unicode_decode() and unicode_encode(), as described in README.UNICODE. Still need to decide how to handle errors here, since there is no error return, and a conversion error is not necessarily fatal.
This commit is contained in:
parent
227a6d154b
commit
57ae2f99b7
2 changed files with 85 additions and 4 deletions
|
@ -1,9 +1,8 @@
|
||||||
// $Id$
|
// $Id$
|
||||||
// vim:ft=javascript
|
// vim:ft=javascript
|
||||||
|
|
||||||
ARG_ENABLE('unicode' , 'ICU API extension', 'no');
|
ARG_ENABLE('unicode' , 'ICU API extension', 'yes');
|
||||||
if (PHP_UNICODE) {
|
if (PHP_UNICODE != 'no') {
|
||||||
|
|
||||||
EXTENSION("unicode", "unicode.c unicode_filter.c locale.c");
|
EXTENSION("unicode", "unicode.c unicode_filter.c locale.c");
|
||||||
AC_DEFINE('HAVE_UNICODE', 1, 'ICU API extension');
|
AC_DEFINE('HAVE_UNICODE', 1, 'ICU API extension');
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,19 +11,101 @@
|
||||||
| license@php.net so we can mail you a copy immediately. |
|
| license@php.net so we can mail you a copy immediately. |
|
||||||
+----------------------------------------------------------------------+
|
+----------------------------------------------------------------------+
|
||||||
| Authors: Andrei Zmievski <andrei@php.net> |
|
| Authors: Andrei Zmievski <andrei@php.net> |
|
||||||
|
| Wez Furlong <wez@php.net> |
|
||||||
+----------------------------------------------------------------------+
|
+----------------------------------------------------------------------+
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* $Id$ */
|
/* $Id$ */
|
||||||
|
|
||||||
#include "php_unicode.h"
|
#include "php_unicode.h"
|
||||||
|
|
||||||
#if HAVE_UNICODE
|
#if HAVE_UNICODE
|
||||||
|
#include "zend_unicode.h"
|
||||||
|
|
||||||
|
/* {{{ proto unicode unicode_decode(string $input, string $encoding)
|
||||||
|
Takes a string in the souce encoding and converts it to a UTF-16 unicode string, returning the result */
|
||||||
|
static PHP_FUNCTION(unicode_decode)
|
||||||
|
{
|
||||||
|
union {
|
||||||
|
void *vptr;
|
||||||
|
char *bin;
|
||||||
|
} input;
|
||||||
|
zend_uchar type;
|
||||||
|
int len;
|
||||||
|
char *encoding;
|
||||||
|
int enclen;
|
||||||
|
UErrorCode status;
|
||||||
|
UConverter *conv = NULL;
|
||||||
|
UChar *target;
|
||||||
|
int32_t targetlen;
|
||||||
|
|
||||||
|
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ts", &input.vptr, &len, &type, &encoding, &enclen)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (type == IS_UNICODE) {
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "input string is already unicode");
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
conv = ucnv_open(encoding, &status);
|
||||||
|
if (!conv) {
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not locate converter for %s", encoding);
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
zend_convert_to_unicode(conv, &target, &targetlen, input.bin, len, &status);
|
||||||
|
if (U_FAILURE(status)) {
|
||||||
|
/* TODO: error handling semantics ? */
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "conversion was not entirely successful: %d", status);
|
||||||
|
}
|
||||||
|
RETVAL_UNICODEL(target, targetlen, 0);
|
||||||
|
|
||||||
|
ucnv_close(conv);
|
||||||
|
}
|
||||||
|
/* }}} */
|
||||||
|
|
||||||
|
/* {{{ proto string unicode_encode(unicode $input, string $encoding)
|
||||||
|
Takes a unicode string and converts it to a string in the specified encoding */
|
||||||
|
static PHP_FUNCTION(unicode_encode)
|
||||||
|
{
|
||||||
|
UChar *uni;
|
||||||
|
int len;
|
||||||
|
char *encoding;
|
||||||
|
int enclen;
|
||||||
|
UErrorCode status;
|
||||||
|
UConverter *conv = NULL;
|
||||||
|
char *target;
|
||||||
|
int32_t targetlen;
|
||||||
|
|
||||||
|
if (FAILURE == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "us", &uni, &len, &encoding, &enclen)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
conv = ucnv_open(encoding, &status);
|
||||||
|
if (!conv) {
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "could not locate converter for %s", encoding);
|
||||||
|
RETURN_FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
status = U_ZERO_ERROR;
|
||||||
|
zend_convert_from_unicode(conv, &target, &targetlen, uni, len, &status);
|
||||||
|
if (U_FAILURE(status)) {
|
||||||
|
/* TODO: error handling semantics ? */
|
||||||
|
php_error_docref(NULL TSRMLS_CC, E_WARNING, "conversion was not entirely successful: %d", status);
|
||||||
|
}
|
||||||
|
RETVAL_STRINGL(target, targetlen, 0);
|
||||||
|
|
||||||
|
ucnv_close(conv);
|
||||||
|
}
|
||||||
/* {{{ unicode_functions[] */
|
/* {{{ unicode_functions[] */
|
||||||
function_entry unicode_functions[] = {
|
function_entry unicode_functions[] = {
|
||||||
PHP_FE(icu_loc_get_default, NULL)
|
PHP_FE(icu_loc_get_default, NULL)
|
||||||
PHP_FE(icu_loc_set_default, NULL)
|
PHP_FE(icu_loc_set_default, NULL)
|
||||||
|
PHP_FE(unicode_decode, NULL)
|
||||||
|
PHP_FE(unicode_encode, NULL)
|
||||||
{ NULL, NULL, NULL }
|
{ NULL, NULL, NULL }
|
||||||
};
|
};
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue