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$
|
||||
// vim:ft=javascript
|
||||
|
||||
ARG_ENABLE('unicode' , 'ICU API extension', 'no');
|
||||
if (PHP_UNICODE) {
|
||||
|
||||
ARG_ENABLE('unicode' , 'ICU API extension', 'yes');
|
||||
if (PHP_UNICODE != 'no') {
|
||||
EXTENSION("unicode", "unicode.c unicode_filter.c locale.c");
|
||||
AC_DEFINE('HAVE_UNICODE', 1, 'ICU API extension');
|
||||
}
|
||||
|
|
|
@ -11,19 +11,101 @@
|
|||
| license@php.net so we can mail you a copy immediately. |
|
||||
+----------------------------------------------------------------------+
|
||||
| Authors: Andrei Zmievski <andrei@php.net> |
|
||||
| Wez Furlong <wez@php.net> |
|
||||
+----------------------------------------------------------------------+
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
#include "php_unicode.h"
|
||||
|
||||
#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[] */
|
||||
function_entry unicode_functions[] = {
|
||||
PHP_FE(icu_loc_get_default, NULL)
|
||||
PHP_FE(icu_loc_set_default, NULL)
|
||||
PHP_FE(unicode_decode, NULL)
|
||||
PHP_FE(unicode_encode, NULL)
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
/* }}} */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue