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