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:
Wez Furlong 2005-08-13 13:43:31 +00:00
parent 227a6d154b
commit 57ae2f99b7
2 changed files with 85 additions and 4 deletions

View file

@ -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');
}

View file

@ -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 }
};
/* }}} */