php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login

Patch intl_icu_4.8_fix.1.diff for intl Bug #61448

Patch version 2012-03-20 09:08 UTC

Return to Bug #61448 | Download this patch
Patch Revisions:

Developer: ab@php.net

Index: ext/intl/tests/dateformat_set_timezone_id2.phpt
===================================================================
--- ext/intl/tests/dateformat_set_timezone_id2.phpt	(revision 0)
+++ ext/intl/tests/dateformat_set_timezone_id2.phpt	(revision 0)
@@ -0,0 +1,76 @@
+--TEST--
+datefmt_set_timezone_id_code() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Test for the datefmt_set_timezone_id  function
+ */
+
+
+function ut_main()
+{
+	$timezone_id_arr = array (
+		'America/New_York',
+		'America/Los_Angeles',
+		'America/Chicago',
+		'CN'
+	);
+	$timestamp_entry = 0;
+
+	$res_str = '';
+
+	$fmt = ut_datefmt_create( "en_US",  IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/San_Francisco' , IntlDateFormatter::GREGORIAN  );
+	$timezone_id = ut_datefmt_get_timezone_id( $fmt );
+	$res_str .= "\nAfter creation of the dateformatter :  timezone_id= $timezone_id\n";
+
+	foreach( $timezone_id_arr as $timezone_id_entry )
+	{
+
+		$res_str .= "-----------";
+		$res_str .= "\nTrying to set timezone_id= $timezone_id_entry";
+		ut_datefmt_set_timezone_id( $fmt , $timezone_id_entry );
+		$timezone_id = ut_datefmt_get_timezone_id( $fmt );
+		$res_str .= "\nAfter call to set_timezone_id :  timezone_id= $timezone_id";
+		$formatted = ut_datefmt_format( $fmt, 0);
+		$res_str .= "\nFormatting timestamp=0 resulted in  $formatted";
+		$formatted = ut_datefmt_format( $fmt, 3600);
+		$res_str .= "\nFormatting timestamp=3600 resulted in  $formatted";
+		$res_str .= "\n";
+
+	}
+
+	return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+
+// Run the test
+ut_run();
+?>
+--EXPECT--
+After creation of the dateformatter :  timezone_id= America/San_Francisco
+-----------
+Trying to set timezone_id= America/New_York
+After call to set_timezone_id :  timezone_id= America/New_York
+Formatting timestamp=0 resulted in  Wednesday, December 31, 1969 7:00:00 PM Eastern Standard Time
+Formatting timestamp=3600 resulted in  Wednesday, December 31, 1969 8:00:00 PM Eastern Standard Time
+-----------
+Trying to set timezone_id= America/Los_Angeles
+After call to set_timezone_id :  timezone_id= America/Los_Angeles
+Formatting timestamp=0 resulted in  Wednesday, December 31, 1969 4:00:00 PM Pacific Standard Time
+Formatting timestamp=3600 resulted in  Wednesday, December 31, 1969 5:00:00 PM Pacific Standard Time
+-----------
+Trying to set timezone_id= America/Chicago
+After call to set_timezone_id :  timezone_id= America/Chicago
+Formatting timestamp=0 resulted in  Wednesday, December 31, 1969 6:00:00 PM Central Standard Time
+Formatting timestamp=3600 resulted in  Wednesday, December 31, 1969 7:00:00 PM Central Standard Time
+-----------
+Trying to set timezone_id= CN
+After call to set_timezone_id :  timezone_id= CN
+Formatting timestamp=0 resulted in  Thursday, January 1, 1970 12:00:00 AM GMT
+Formatting timestamp=3600 resulted in  Thursday, January 1, 1970 1:00:00 AM GMT
Index: ext/intl/tests/collator_get_locale2.phpt
===================================================================
--- ext/intl/tests/collator_get_locale2.phpt	(revision 0)
+++ ext/intl/tests/collator_get_locale2.phpt	(revision 0)
@@ -0,0 +1,51 @@
+--TEST--
+get_locale() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try to specify valid and invalid locale types when getting locale.
+ */
+
+function ut_main()
+{
+    $locales = array(
+        Locale::VALID_LOCALE,
+        Locale::ACTUAL_LOCALE,
+        100,
+        -100,
+        -9999999999999,
+        9999999999999,
+        1.2,
+    );
+
+    $coll = ut_coll_create( 'en_US' );
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $rc = ut_coll_get_locale( $coll, $locale );
+
+        $res_str .= sprintf(
+            "Locale of type %s is %s\n",
+            dump( $locale ),
+            dump( $rc ) );
+    }
+
+    return $res_str . "\n";
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+?>
+--EXPECT--
+Locale of type 1 is 'en_US'
+Locale of type 0 is 'root'
+Locale of type 100 is false
+Locale of type -100 is false
+Locale of type -9999999999999 is false
+Locale of type 9999999999999 is false
+Locale of type 1.2 is 'en_US'
Index: ext/intl/tests/dateformat_get_set_pattern2.phpt
===================================================================
--- ext/intl/tests/dateformat_get_set_pattern2.phpt	(revision 0)
+++ ext/intl/tests/dateformat_get_set_pattern2.phpt	(revision 0)
@@ -0,0 +1,85 @@
+--TEST--
+datefmt_get_pattern_code and datefmt_set_pattern_code() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+
+<?php
+
+/*
+ * Test for the datefmt_get_pattern & datefmt_set_pattern function
+ */
+
+
+function ut_main()
+{
+        $pattern_arr = array (
+                'DD-MM-YYYY hh:mm:ss',
+		'yyyy-DDD.hh:mm:ss z',
+                "yyyy/MM/dd",
+                "yyyyMMdd"
+        );
+
+        $res_str = '';
+
+        $start_pattern = 'dd-MM-YY';
+        $res_str .= "\nCreating IntlDateFormatter with pattern = $start_pattern ";
+        //$fmt = ut_datefmt_create( "en-US",  IntlDateFormatter::SHORT, IntlDateFormatter::SHORT , 'America/New_York', IntlDateFormatter::GREGORIAN , $start_pattern );
+        $fmt = ut_datefmt_create( "en-US",  IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/New_York', IntlDateFormatter::GREGORIAN , $start_pattern );
+        $pattern = ut_datefmt_get_pattern( $fmt);
+        $res_str .= "\nAfter call to get_pattern :  pattern= $pattern";
+	$formatted = ut_datefmt_format($fmt,0);
+	$res_str .= "\nResult of formatting timestamp=0 is :  \n$formatted";
+
+
+        foreach( $pattern_arr as $pattern_entry )
+        {
+                $res_str .= "\n-------------------";
+                $res_str .= "\nSetting IntlDateFormatter with pattern = $pattern_entry ";
+                ut_datefmt_set_pattern( $fmt , $pattern_entry );
+                $pattern = ut_datefmt_get_pattern( $fmt);
+                $res_str .= "\nAfter call to get_pattern :  pattern= $pattern";
+		$formatted = ut_datefmt_format($fmt,0);
+                $res_str .= "\nResult of formatting timestamp=0 with the new pattern is :  \n$formatted";
+                $res_str .= "\n";
+
+        }
+
+        return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+
+// Run the test
+ut_run();
+?>
+--EXPECT--
+Creating IntlDateFormatter with pattern = dd-MM-YY 
+After call to get_pattern :  pattern= dd-MM-YY
+Result of formatting timestamp=0 is :  
+31-12-70
+-------------------
+Setting IntlDateFormatter with pattern = DD-MM-YYYY hh:mm:ss 
+After call to get_pattern :  pattern= DD-MM-YYYY hh:mm:ss
+Result of formatting timestamp=0 with the new pattern is :  
+365-12-1970 07:00:00
+
+-------------------
+Setting IntlDateFormatter with pattern = yyyy-DDD.hh:mm:ss z 
+After call to get_pattern :  pattern= yyyy-DDD.hh:mm:ss z
+Result of formatting timestamp=0 with the new pattern is :  
+1969-365.07:00:00 EST
+
+-------------------
+Setting IntlDateFormatter with pattern = yyyy/MM/dd 
+After call to get_pattern :  pattern= yyyy/MM/dd
+Result of formatting timestamp=0 with the new pattern is :  
+1969/12/31
+
+-------------------
+Setting IntlDateFormatter with pattern = yyyyMMdd 
+After call to get_pattern :  pattern= yyyyMMdd
+Result of formatting timestamp=0 with the new pattern is :  
+19691231
Index: ext/intl/tests/locale_get_display_script2.phpt
===================================================================
--- ext/intl/tests/locale_get_display_script2.phpt	(revision 0)
+++ ext/intl/tests/locale_get_display_script2.phpt	(revision 0)
@@ -0,0 +1,275 @@
+--TEST--
+locale_get_display_script()  icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try getting the display_script for different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $disp_locales=array('en','fr','de');
+
+    $locales = array(
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'x-whatever',
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $res_str .= "locale='$locale'\n";
+        foreach( $disp_locales as $disp_locale )
+        {
+            $scr = ut_loc_get_display_script( $locale ,$disp_locale );
+            $res_str .= "disp_locale=$disp_locale :  display_script=$scr";
+            $res_str .= "\n";
+        }
+        $res_str .= "-----------------\n";
+    }
+
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTREGEX--
+locale='uk-ua_CALIFORNIA@currency=;currency=GRN'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='root'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='uk@currency=EURO'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='Hindi'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='de'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='fr'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='ja'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='i-enochian'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='zh-Hant'
+disp_locale=en :  display_script=Traditional
+disp_locale=fr :  display_script=idéogrammes han (\(variante traditionnelle\)|traditionnels)
+disp_locale=de :  display_script=Traditionell
+-----------------
+locale='zh-Hans'
+disp_locale=en :  display_script=Simplified
+disp_locale=fr :  display_script=idéogrammes han (\(variante simplifiée\)|simplifiés)
+disp_locale=de :  display_script=Vereinfacht
+-----------------
+locale='sr-Cyrl'
+disp_locale=en :  display_script=Cyrillic
+disp_locale=fr :  display_script=cyrillique
+disp_locale=de :  display_script=Kyrillisch
+-----------------
+locale='sr-Latn'
+disp_locale=en :  display_script=Latin
+disp_locale=fr :  display_script=latin
+disp_locale=de :  display_script=Lateinisch
+-----------------
+locale='zh-Hans-CN'
+disp_locale=en :  display_script=Simplified
+disp_locale=fr :  display_script=idéogrammes han (\(variante simplifiée\)|simplifiés)
+disp_locale=de :  display_script=Vereinfacht
+-----------------
+locale='sr-Latn-CS'
+disp_locale=en :  display_script=Latin
+disp_locale=fr :  display_script=latin
+disp_locale=de :  display_script=Lateinisch
+-----------------
+locale='sl-rozaj'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='sl-nedis'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='de-CH-1901'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='sl-IT-nedis'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='sl-Latn-IT-nedis'
+disp_locale=en :  display_script=Latin
+disp_locale=fr :  display_script=latin
+disp_locale=de :  display_script=Lateinisch
+-----------------
+locale='de-DE'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='en-US'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='es-419'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='de-CH-x-phonebk'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='az-Arab-x-AZE-derbend'
+disp_locale=en :  display_script=Arabic
+disp_locale=fr :  display_script=arabe
+disp_locale=de :  display_script=Arabisch
+-----------------
+locale='zh-min'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='zh-min-nan-Hant-CN'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='x-whatever'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='qaa-Qaaa-QM-x-southern'
+disp_locale=en :  display_script=Qaaa
+disp_locale=fr :  display_script=Qaaa
+disp_locale=de :  display_script=Qaaa
+-----------------
+locale='sr-Latn-QM'
+disp_locale=en :  display_script=Latin
+disp_locale=fr :  display_script=latin
+disp_locale=de :  display_script=Lateinisch
+-----------------
+locale='sr-Qaaa-CS'
+disp_locale=en :  display_script=Qaaa
+disp_locale=fr :  display_script=Qaaa
+disp_locale=de :  display_script=Qaaa
+-----------------
+locale='en-US-u-islamCal'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='zh-CN-a-myExt-x-private'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='en-a-myExt-b-another'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='de-419-DE'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='a-DE'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
+locale='ar-a-aaa-b-bbb-a-ccc'
+disp_locale=en :  display_script=
+disp_locale=fr :  display_script=
+disp_locale=de :  display_script=
+-----------------
Index: ext/intl/tests/formatter_format2.phpt
===================================================================
--- ext/intl/tests/formatter_format2.phpt	(revision 0)
+++ ext/intl/tests/formatter_format2.phpt	(revision 0)
@@ -0,0 +1,130 @@
+--TEST--
+numfmt_format() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Format a number using misc locales/patterns.
+ */
+
+/*
+ * TODO: doesn't pass on ICU 3.6 because 'ru' and 'de' locales changed
+ * currency and percent formatting.
+ */
+
+function ut_main()
+{
+    $styles = array(
+        NumberFormatter::PATTERN_DECIMAL => '##.#####################',
+        NumberFormatter::DECIMAL => '',
+        NumberFormatter::CURRENCY => '',
+        NumberFormatter::PERCENT => '',
+        NumberFormatter::SCIENTIFIC => '',
+        NumberFormatter::SPELLOUT => '@@@@@@@',
+        NumberFormatter::ORDINAL => '',
+        NumberFormatter::DURATION => '',
+        NumberFormatter::PATTERN_RULEBASED => '#####.###',
+        1234999, // bad one
+    );
+
+   $integer = array(
+        NumberFormatter::ORDINAL => '',
+        NumberFormatter::DURATION => '',
+   );
+    $locales = array(
+        'en_US',
+        'ru_UA',
+        'de',
+        'fr',
+        'en_UK'
+    );
+
+    $str_res = '';
+    $number = 1234567.891234567890000;
+
+    foreach( $locales as $locale )
+    {
+        $str_res .= "\nLocale is: $locale\n";
+        foreach( $styles as $style => $pattern )
+        {
+            $fmt = ut_nfmt_create( $locale, $style, $pattern );
+
+			if(!$fmt) {
+				$str_res .= "Bad formatter!\n";
+				continue;
+			}
+            $str_res .= dump( isset($integer[$style])?ut_nfmt_format( $fmt, $number, NumberFormatter::TYPE_INT32):ut_nfmt_format( $fmt, $number ) ) . "\n";
+        }
+    }
+    return $str_res;
+}
+
+include_once( 'ut_common.inc' );
+
+// Run the test
+ut_run();
+
+?>
+--EXPECTREGEX--
+Locale is: en_US
+'1234567.89123457'
+'1,234,567.891'
+'\$1,234,567.89'
+'123,456,789%'
+'1.23456789123457E6'
+'one million,? two hundred (and )?thirty-four thousand,? five hundred (and )?sixty-seven point eight nine one two three four five seven'
+'1,234,567(th|ᵗʰ)'
+'342:56:07'
+'#####.###'
+Bad formatter!
+
+Locale is: ru_UA
+'1234567,89123457'
+'1 234 567,891'
+'1 234 567,89 ?(грн\.|₴)'
+'123 456 789 ?%'
+'1,23456789123457E6'
+'один миллион двести тридцать четыре тысяч пятьсот шестьдесят семь запятая восемь девять один два три четыре пять семь'
+'1 234 567.?'
+'1 234 567'
+'#####.###'
+Bad formatter!
+
+Locale is: de
+'1234567,89123457'
+'1.234.567,891'
+'(¤ )?1.234.567,89( ¤)?'
+'123\.456\.789 %'
+'1,23456789123457E6'
+'eine Million zwei­hundert­vier­und­dreißig­tausend­fünf­hundert­sieben­und­sechzig Komma acht neun eins zwei drei vier fünf sieben'
+'1.234.567.?'
+'1.234.567'
+'#####.###'
+Bad formatter!
+
+Locale is: fr
+'1234567,89123457'
+'1 234 567,891'
+'1 234 567,89 ¤'
+'123 456 789 ?%'
+'1,23456789123457E6'
+'un million deux-cent-trente-quatre-mille-cinq-cent-soixante-sept virgule huit neuf un deux trois quatre cinq sept'
+'1 234 567e'
+'1 234 567'
+'#####.###'
+Bad formatter!
+
+Locale is: en_UK
+'1234567.89123457'
+'1,234,567.891'
+'¤1,234,567.89'
+'123,456,789%'
+'1.23456789123457E6'
+'one million,? two hundred (and )?thirty-four thousand,? five hundred (and )?sixty-seven point eight nine one two three four five seven'
+'1,234,567(th|ᵗʰ)'
+'342:56:07'
+'#####.###'
+Bad formatter!
Index: ext/intl/tests/locale_get_display_name2.phpt
===================================================================
--- ext/intl/tests/locale_get_display_name2.phpt	(revision 0)
+++ ext/intl/tests/locale_get_display_name2.phpt	(revision 0)
@@ -0,0 +1,342 @@
+--TEST--
+locale_get_display_name() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try getting the display_name for different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str='';
+
+	$disp_locales=array('en','fr','de');
+
+    $locales = array(
+        'sl_IT_nedis_KIRTI',
+        'sl_IT_nedis-a-kirti-x-xyz',
+        'sl_IT_rozaj',
+        'sl_IT_NEDIS_ROJAZ_1901',
+        'i-enochian',
+        'zh-hakka',
+        'zh-wuu',
+        'i-tay',
+        'sgn-BE-nl',
+        'sgn-CH-de',
+        'sl_IT_rozaj@currency=EUR',
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'x-whatever',
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+
+    $res_str = '';
+
+   	foreach( $locales as $locale )
+    {
+       	$res_str .= "locale='$locale'\n";
+   		foreach( $disp_locales as $disp_locale )
+    	{
+        	$scr = ut_loc_get_display_name( $locale ,$disp_locale );
+		$scr = str_replace(array('(', ')'), '#', $scr); 
+        	$res_str .= "disp_locale=$disp_locale :  display_name=$scr";
+        	$res_str .= "\n";
+		} 
+        $res_str .= "-----------------\n";
+    }
+
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTREGEX--
+locale='sl_IT_nedis_KIRTI'
+disp_locale=en :  display_name=Slovenian #Italy, NEDIS_KIRTI#
+disp_locale=fr :  display_name=slovène #Italie, NEDIS_KIRTI#
+disp_locale=de :  display_name=Slowenisch #Italien, NEDIS_KIRTI#
+-----------------
+locale='sl_IT_nedis-a-kirti-x-xyz'
+disp_locale=en :  display_name=Slovenian #Italy, NEDIS_A_KIRTI_X_XYZ#
+disp_locale=fr :  display_name=slovène #Italie, NEDIS_A_KIRTI_X_XYZ#
+disp_locale=de :  display_name=Slowenisch #Italien, NEDIS_A_KIRTI_X_XYZ#
+-----------------
+locale='sl_IT_rozaj'
+disp_locale=en :  display_name=Slovenian #Italy, Resian#
+disp_locale=fr :  display_name=slovène #Italie, dialecte de Resia#
+disp_locale=de :  display_name=Slowenisch #Italien, (ROZAJ|Resianisch)#
+-----------------
+locale='sl_IT_NEDIS_ROJAZ_1901'
+disp_locale=en :  display_name=Slovenian #Italy, NEDIS_ROJAZ_1901#
+disp_locale=fr :  display_name=slovène #Italie, NEDIS_ROJAZ_1901#
+disp_locale=de :  display_name=Slowenisch #Italien, NEDIS_ROJAZ_1901#
+-----------------
+locale='i-enochian'
+disp_locale=en :  display_name=i-enochian #Private-Use=i-enochian#
+disp_locale=fr :  display_name=i-enochian #Usage privé=i-enochian#
+disp_locale=de :  display_name=i-enochian #Privatnutzung=i-enochian#
+-----------------
+locale='zh-hakka'
+disp_locale=en :  display_name=Chinese( #HAKKA#)?
+disp_locale=fr :  display_name=chinois( #HAKKA#)?
+disp_locale=de :  display_name=Chinesisch( #HAKKA#)?
+-----------------
+locale='zh-wuu'
+disp_locale=en :  display_name=Chinese #WUU#
+disp_locale=fr :  display_name=chinois #WUU#
+disp_locale=de :  display_name=Chinesisch #WUU#
+-----------------
+locale='i-tay'
+disp_locale=en :  display_name=i-tay
+disp_locale=fr :  display_name=i-tay
+disp_locale=de :  display_name=i-tay
+-----------------
+locale='sgn-BE-nl'
+disp_locale=en :  display_name=Sign Languages? #Belgium, NL#
+disp_locale=fr :  display_name=langues? des signes #Belgique, NL#
+disp_locale=de :  display_name=Gebärdensprache #Belgien, NL#
+-----------------
+locale='sgn-CH-de'
+disp_locale=en :  display_name=Sign Languages? #Switzerland, DE#
+disp_locale=fr :  display_name=langues? des signes #Suisse, DE#
+disp_locale=de :  display_name=Gebärdensprache #Schweiz, DE#
+-----------------
+locale='sl_IT_rozaj@currency=EUR'
+disp_locale=en :  display_name=Slovenian #Italy, Resian, [Cc]urrency=Euro#
+disp_locale=fr :  display_name=slovène #Italie, dialecte de Resia, Devise=euro#
+disp_locale=de :  display_name=Slowenisch #Italien, (ROZAJ|Resianisch), Währung=Euro#
+-----------------
+locale='uk-ua_CALIFORNIA@currency=;currency=GRN'
+disp_locale=en :  display_name=Ukrainian #Ukraine, CALIFORNIA, [Cc]urrency#
+disp_locale=fr :  display_name=ukrainien #Ukraine, CALIFORNIA, Devise#
+disp_locale=de :  display_name=Ukrainisch #Ukraine, CALIFORNIA, Währung#
+-----------------
+locale='root'
+disp_locale=en :  display_name=Root
+disp_locale=fr :  display_name=racine
+disp_locale=de :  display_name=[Rr]oot
+-----------------
+locale='uk@currency=EURO'
+disp_locale=en :  display_name=Ukrainian #[Cc]urrency=EURO#
+disp_locale=fr :  display_name=ukrainien #Devise=EURO#
+disp_locale=de :  display_name=Ukrainisch #Währung=EURO#
+-----------------
+locale='Hindi'
+disp_locale=en :  display_name=hindi
+disp_locale=fr :  display_name=hindi
+disp_locale=de :  display_name=hindi
+-----------------
+locale='de'
+disp_locale=en :  display_name=German
+disp_locale=fr :  display_name=allemand
+disp_locale=de :  display_name=Deutsch
+-----------------
+locale='fr'
+disp_locale=en :  display_name=French
+disp_locale=fr :  display_name=français
+disp_locale=de :  display_name=Französisch
+-----------------
+locale='ja'
+disp_locale=en :  display_name=Japanese
+disp_locale=fr :  display_name=japonais
+disp_locale=de :  display_name=Japanisch
+-----------------
+locale='i-enochian'
+disp_locale=en :  display_name=i-enochian #Private-Use=i-enochian#
+disp_locale=fr :  display_name=i-enochian #Usage privé=i-enochian#
+disp_locale=de :  display_name=i-enochian #Privatnutzung=i-enochian#
+-----------------
+locale='zh-Hant'
+disp_locale=en :  display_name=Chinese #Traditional#
+disp_locale=fr :  display_name=chinois #idéogrammes han (#variante traditionnelle#|traditionnels)#
+disp_locale=de :  display_name=Chinesisch #Traditionell#
+-----------------
+locale='zh-Hans'
+disp_locale=en :  display_name=Chinese #Simplified#
+disp_locale=fr :  display_name=chinois #idéogrammes han (#variante simplifiée#|simplifiés)#
+disp_locale=de :  display_name=Chinesisch #Vereinfacht#
+-----------------
+locale='sr-Cyrl'
+disp_locale=en :  display_name=Serbian #Cyrillic#
+disp_locale=fr :  display_name=serbe #cyrillique#
+disp_locale=de :  display_name=Serbisch #Kyrillisch#
+-----------------
+locale='sr-Latn'
+disp_locale=en :  display_name=Serbian #Latin#
+disp_locale=fr :  display_name=serbe #latin#
+disp_locale=de :  display_name=Serbisch #Lateinisch#
+-----------------
+locale='zh-Hans-CN'
+disp_locale=en :  display_name=Chinese #Simplified, China#
+disp_locale=fr :  display_name=chinois #idéogrammes han (#variante simplifiée#|simplifiés), Chine#
+disp_locale=de :  display_name=Chinesisch #Vereinfacht, China#
+-----------------
+locale='sr-Latn-CS'
+disp_locale=en :  display_name=Serbian #Latin, Serbia [aA]nd Montenegro#
+disp_locale=fr :  display_name=serbe #latin, Serbie-et-Monténégro#
+disp_locale=de :  display_name=Serbisch #Lateinisch, Serbien und Montenegro#
+-----------------
+locale='sl-rozaj'
+disp_locale=en :  display_name=Slovenian #Resian#
+disp_locale=fr :  display_name=slovène #dialecte de Resia#
+disp_locale=de :  display_name=Slowenisch( #(ROZAJ|Resianisch)#)?
+-----------------
+locale='sl-nedis'
+disp_locale=en :  display_name=Slovenian #Natisone dialect#
+disp_locale=fr :  display_name=slovène #dialecte de Natisone#
+disp_locale=de :  display_name=Slowenisch #Natisone-Dialekt#
+-----------------
+locale='de-CH-1901'
+disp_locale=en :  display_name=German #Switzerland, Traditional German orthography#
+disp_locale=fr :  display_name=allemand #Suisse, orthographe allemande traditionnelle#
+disp_locale=de :  display_name=Deutsch #Schweiz, (1901|[aA]lte deutsche Rechtschreibung)#
+-----------------
+locale='sl-IT-nedis'
+disp_locale=en :  display_name=Slovenian #Italy, Natisone dialect#
+disp_locale=fr :  display_name=slovène #Italie, dialecte de Natisone#
+disp_locale=de :  display_name=Slowenisch #Italien, (NEDIS|Natisone-Dialekt)#
+-----------------
+locale='sl-Latn-IT-nedis'
+disp_locale=en :  display_name=Slovenian #Latin, Italy, Natisone dialect#
+disp_locale=fr :  display_name=slovène #latin, Italie, dialecte de Natisone#
+disp_locale=de :  display_name=Slowenisch #Lateinisch, Italien, (NEDIS|Natisone-Dialekt)#
+-----------------
+locale='de-DE'
+disp_locale=en :  display_name=German #Germany#
+disp_locale=fr :  display_name=allemand #Allemagne#
+disp_locale=de :  display_name=Deutsch #Deutschland#
+-----------------
+locale='en-US'
+disp_locale=en :  display_name=English #United States#
+disp_locale=fr :  display_name=anglais #États-Unis#
+disp_locale=de :  display_name=Englisch #Vereinigte Staaten#
+-----------------
+locale='es-419'
+disp_locale=en :  display_name=Spanish #Latin America#
+disp_locale=fr :  display_name=espagnol #Amérique latine#
+disp_locale=de :  display_name=Spanisch #Lateinamerika#
+-----------------
+locale='de-CH-x-phonebk'
+disp_locale=en :  display_name=German #Switzerland, Private-Use=phonebk#
+disp_locale=fr :  display_name=allemand #Suisse, Usage privé=phonebk#
+disp_locale=de :  display_name=Deutsch #Schweiz, Privatnutzung=phonebk#
+-----------------
+locale='az-Arab-x-AZE-derbend'
+disp_locale=en :  display_name=Azerbaijani #Arabic, Private-Use=aze-derbend#
+disp_locale=fr :  display_name=azéri #arabe, Usage privé=aze-derbend#
+disp_locale=de :  display_name=Aserbaidschanisch #Arabisch, Privatnutzung=aze-derbend#
+-----------------
+locale='zh-min'
+disp_locale=en :  display_name=Chinese #MIN#
+disp_locale=fr :  display_name=chinois #MIN#
+disp_locale=de :  display_name=Chinesisch #MIN#
+-----------------
+locale='zh-min-nan-Hant-CN'
+disp_locale=en :  display_name=Chinese #MIN, NAN_HANT_CN#
+disp_locale=fr :  display_name=chinois #MIN, NAN_HANT_CN#
+disp_locale=de :  display_name=Chinesisch #MIN, NAN_HANT_CN#
+-----------------
+locale='x-whatever'
+disp_locale=en :  display_name=x-whatever #Private-Use=whatever#
+disp_locale=fr :  display_name=x-whatever #Usage privé=whatever#
+disp_locale=de :  display_name=x-whatever #Privatnutzung=whatever#
+-----------------
+locale='qaa-Qaaa-QM-x-southern'
+disp_locale=en :  display_name=qaa #Qaaa, QM, Private-Use=southern#
+disp_locale=fr :  display_name=qaa #Qaaa, QM, Usage privé=southern#
+disp_locale=de :  display_name=qaa #Qaaa, QM, Privatnutzung=southern#
+-----------------
+locale='sr-Latn-QM'
+disp_locale=en :  display_name=Serbian #Latin, QM#
+disp_locale=fr :  display_name=serbe #latin, QM#
+disp_locale=de :  display_name=Serbisch #Lateinisch, QM#
+-----------------
+locale='sr-Qaaa-CS'
+disp_locale=en :  display_name=Serbian #Qaaa, Serbia [aA]nd Montenegro#
+disp_locale=fr :  display_name=serbe #Qaaa, Serbie-et-Monténégro#
+disp_locale=de :  display_name=Serbisch #Qaaa, Serbien und Montenegro#
+-----------------
+locale='en-US-u-islamCal'
+disp_locale=en :  display_name=English #United States, attribute=islamcal#
+disp_locale=fr :  display_name=anglais #États-Unis, attribute=islamcal#
+disp_locale=de :  display_name=Englisch #Vereinigte Staaten, attribute=islamcal#
+-----------------
+locale='zh-CN-a-myExt-x-private'
+disp_locale=en :  display_name=Chinese #China, a=myext, Private-Use=private#
+disp_locale=fr :  display_name=chinois #Chine, a=myext, Usage privé=private#
+disp_locale=de :  display_name=Chinesisch #China, a=myext, Privatnutzung=private#
+-----------------
+locale='en-a-myExt-b-another'
+disp_locale=en :  display_name=English #a=myext, b=another#
+disp_locale=fr :  display_name=anglais #a=myext, b=another#
+disp_locale=de :  display_name=Englisch #a=myext, b=another#
+-----------------
+locale='de-419-DE'
+disp_locale=en :  display_name=German #Latin America, DE#
+disp_locale=fr :  display_name=allemand #Amérique latine, DE#
+disp_locale=de :  display_name=Deutsch #Lateinamerika, DE#
+-----------------
+locale='a-DE'
+disp_locale=en :  display_name=a #Germany#
+disp_locale=fr :  display_name=a #Allemagne#
+disp_locale=de :  display_name=a #Deutschland#
+-----------------
+locale='ar-a-aaa-b-bbb-a-ccc'
+disp_locale=en :  display_name=Arabic #a=aaa, b=bbb#
+disp_locale=fr :  display_name=arabe #a=aaa, b=bbb#
+disp_locale=de :  display_name=Arabisch #a=aaa, b=bbb#
+-----------------
Index: ext/intl/tests/locale_get_keywords2.phpt
===================================================================
--- ext/intl/tests/locale_get_keywords2.phpt	(revision 0)
+++ ext/intl/tests/locale_get_keywords2.phpt	(revision 0)
@@ -0,0 +1,151 @@
+--TEST--
+locale_get_keywords() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try getting the keywords for different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $locales = array(
+		"de_DE@currency=EUR;collation=PHONEBOOK",
+        'uk-ua_CALIFORNIA@currency=GRN'
+	);
+
+    $locales = array(
+	'de_DE@currency=EUR;collation=PHONEBOOK',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:	
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags 
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'x-whatever',
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $keywords_arr = ut_loc_get_keywords( $locale);
+        $res_str .= "$locale: ";
+		if( $keywords_arr){
+			foreach( $keywords_arr as $key => $value){
+        			$res_str .= "Key is $key and Value is $value \n";
+			}
+		}
+		else{
+			$res_str .= "No keywords found.";
+		}
+        $res_str .= "\n";
+    }
+
+    $res_str .= "\n";
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECT--
+de_DE@currency=EUR;collation=PHONEBOOK: Key is collation and Value is PHONEBOOK 
+Key is currency and Value is EUR 
+
+root: No keywords found.
+uk@currency=EURO: Key is currency and Value is EURO 
+
+Hindi: No keywords found.
+de: No keywords found.
+fr: No keywords found.
+ja: No keywords found.
+i-enochian: Key is x and Value is i-enochian 
+
+zh-Hant: No keywords found.
+zh-Hans: No keywords found.
+sr-Cyrl: No keywords found.
+sr-Latn: No keywords found.
+zh-Hans-CN: No keywords found.
+sr-Latn-CS: No keywords found.
+sl-rozaj: No keywords found.
+sl-nedis: No keywords found.
+de-CH-1901: No keywords found.
+sl-IT-nedis: No keywords found.
+sl-Latn-IT-nedis: No keywords found.
+de-DE: No keywords found.
+en-US: No keywords found.
+es-419: No keywords found.
+de-CH-x-phonebk: Key is x and Value is phonebk 
+
+az-Arab-x-AZE-derbend: Key is x and Value is aze-derbend 
+
+zh-min: No keywords found.
+zh-min-nan-Hant-CN: No keywords found.
+x-whatever: Key is x and Value is whatever 
+
+qaa-Qaaa-QM-x-southern: Key is x and Value is southern 
+
+sr-Latn-QM: No keywords found.
+sr-Qaaa-CS: No keywords found.
+en-US-u-islamCal: Key is attribute and Value is islamcal 
+
+zh-CN-a-myExt-x-private: Key is a and Value is myext 
+Key is x and Value is private 
+
+en-a-myExt-b-another: Key is a and Value is myext 
+Key is b and Value is another 
+
+de-419-DE: No keywords found.
+a-DE: No keywords found.
+ar-a-aaa-b-bbb-a-ccc: Key is a and Value is aaa 
+Key is b and Value is bbb
Index: ext/intl/tests/formatter_get_set_symbol2.phpt
===================================================================
--- ext/intl/tests/formatter_get_set_symbol2.phpt	(revision 0)
+++ ext/intl/tests/formatter_get_set_symbol2.phpt	(revision 0)
@@ -0,0 +1,190 @@
+--TEST--
+numfmt_get/set_symbol() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Get/set symbol.
+ */
+
+
+function ut_main()
+{
+	$longstr = str_repeat("blah", 10);
+    $symbols = array(
+        'DECIMAL_SEPARATOR_SYMBOL' => array( NumberFormatter::DECIMAL_SEPARATOR_SYMBOL, '_._', 12345.123456, NumberFormatter::DECIMAL ),
+        'GROUPING_SEPARATOR_SYMBOL' => array( NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '_,_', 12345.123456, NumberFormatter::DECIMAL ),
+        'PATTERN_SEPARATOR_SYMBOL' => array( NumberFormatter::PATTERN_SEPARATOR_SYMBOL, '_;_', 12345.123456, NumberFormatter::DECIMAL ),
+        'PERCENT_SYMBOL' => array( NumberFormatter::PERCENT_SYMBOL, '_%_', 12345.123456, NumberFormatter::PERCENT ),
+        'ZERO_DIGIT_SYMBOL' => array( NumberFormatter::ZERO_DIGIT_SYMBOL, '_ZD_', 12345.123456, NumberFormatter::DECIMAL ),
+        'DIGIT_SYMBOL' => array( NumberFormatter::DIGIT_SYMBOL, '_DS_', 12345.123456, NumberFormatter::DECIMAL ),
+        'MINUS_SIGN_SYMBOL' => array( NumberFormatter::MINUS_SIGN_SYMBOL, '_-_', -12345.123456, NumberFormatter::DECIMAL ),
+        'PLUS_SIGN_SYMBOL' => array( NumberFormatter::PLUS_SIGN_SYMBOL, '_+_', 12345.123456, NumberFormatter::SCIENTIFIC ),
+        'CURRENCY_SYMBOL' => array( NumberFormatter::CURRENCY_SYMBOL, '_$_', 12345.123456, NumberFormatter::CURRENCY ),
+        'INTL_CURRENCY_SYMBOL' => array( NumberFormatter::INTL_CURRENCY_SYMBOL, '_$_', 12345.123456, NumberFormatter::CURRENCY ),
+        'MONETARY_SEPARATOR_SYMBOL' => array( NumberFormatter::MONETARY_SEPARATOR_SYMBOL, '_MS_', 12345.123456, NumberFormatter::CURRENCY ),
+        'EXPONENTIAL_SYMBOL' => array( NumberFormatter::EXPONENTIAL_SYMBOL, '_E_', 12345.123456, NumberFormatter::SCIENTIFIC ),
+        'PERMILL_SYMBOL' => array( NumberFormatter::PERMILL_SYMBOL, '_PS_', 12345.123456, NumberFormatter::DECIMAL ),
+        'PAD_ESCAPE_SYMBOL' => array( NumberFormatter::PAD_ESCAPE_SYMBOL, '_PE_', 12345.123456, NumberFormatter::DECIMAL ),
+        'INFINITY_SYMBOL' => array( NumberFormatter::INFINITY_SYMBOL, '_IS_', 12345.123456, NumberFormatter::DECIMAL ),
+        'NAN_SYMBOL' => array( NumberFormatter::NAN_SYMBOL, '_N_', 12345.123456, NumberFormatter::DECIMAL ),
+        'SIGNIFICANT_DIGIT_SYMBOL' => array( NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL, '_SD_', 12345.123456, NumberFormatter::DECIMAL ),
+        'MONETARY_GROUPING_SEPARATOR_SYMBOL' => array( NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL, '_MG_', 12345.123456, NumberFormatter::CURRENCY ),
+	'MONETARY_GROUPING_SEPARATOR_SYMBOL-2' => array( NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL, "&nbsp;", 12345.123456, NumberFormatter::CURRENCY ),
+	'MONETARY_GROUPING_SEPARATOR_SYMBOL-3' => array( NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL, $longstr, 12345.123456, NumberFormatter::CURRENCY ),
+    );
+
+    $res_str = '';
+
+    foreach( $symbols as $symb_name => $data )
+    {
+        list( $symb, $new_val, $number, $attr ) = $data;
+
+        $fmt = ut_nfmt_create( 'en_US', $attr);
+
+        $res_str .= "\nSymbol '$symb_name'\n";
+
+        // Get original symbol value.
+        $orig_val = ut_nfmt_get_symbol( $fmt, $symb );
+        $res_str .= "Default symbol: [$orig_val]\n";
+
+        // Set a new symbol value.
+        $res_val = ut_nfmt_set_symbol( $fmt, $symb, $new_val );
+        if( !$res_val )
+            $res_str .= "set_symbol() error: " . ut_nfmt_get_error_message( $fmt ) . "\n";
+
+        // Get the symbol value back.
+        $new_val_check = ut_nfmt_get_symbol( $fmt, $symb );
+        if( !$new_val_check )
+            $res_str .= "get_symbol() error: " . ut_nfmt_get_error_message( $fmt ) . "\n";
+
+        $res_str .= "New symbol: [$new_val_check]\n";
+
+        // Check if the new value has been set.
+        if( $new_val_check !== $new_val )
+            $res_str .= "ERROR: New $symb_name symbol value has not been set correctly.\n";
+
+        // Format the number using the new value.
+        $s = ut_nfmt_format( $fmt, $number );
+        $res_str .= "A number formatted with the new symbol: $s\n";
+
+        // Restore attribute's symbol.
+        ut_nfmt_set_symbol( $fmt, $symb, $orig_val );
+    }
+    $badvals = array(2147483648, -2147483648, -1, 4294901761);
+    foreach($badvals as $badval) {
+	    if(ut_nfmt_get_symbol( $fmt, 2147483648 ))  {
+		$res_str .= "Bad value $badval should return false!\n";
+	    }
+    }
+    return $res_str;
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECT--
+Symbol 'DECIMAL_SEPARATOR_SYMBOL'
+Default symbol: [.]
+New symbol: [_._]
+A number formatted with the new symbol: 12,345_._123
+
+Symbol 'GROUPING_SEPARATOR_SYMBOL'
+Default symbol: [,]
+New symbol: [_,_]
+A number formatted with the new symbol: 12_,_345.123
+
+Symbol 'PATTERN_SEPARATOR_SYMBOL'
+Default symbol: [;]
+New symbol: [_;_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'PERCENT_SYMBOL'
+Default symbol: [%]
+New symbol: [_%_]
+A number formatted with the new symbol: 1,234,512_%_
+
+Symbol 'ZERO_DIGIT_SYMBOL'
+Default symbol: [0]
+New symbol: [_ZD_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'DIGIT_SYMBOL'
+Default symbol: [#]
+New symbol: [_DS_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'MINUS_SIGN_SYMBOL'
+Default symbol: [-]
+New symbol: [_-_]
+A number formatted with the new symbol: _-_12,345.123
+
+Symbol 'PLUS_SIGN_SYMBOL'
+Default symbol: [+]
+New symbol: [_+_]
+A number formatted with the new symbol: 1.2345123456E4
+
+Symbol 'CURRENCY_SYMBOL'
+Default symbol: [$]
+New symbol: [_$_]
+A number formatted with the new symbol: _$_12,345.12
+
+Symbol 'INTL_CURRENCY_SYMBOL'
+Default symbol: [USD]
+New symbol: [_$_]
+A number formatted with the new symbol: $12,345.12
+
+Symbol 'MONETARY_SEPARATOR_SYMBOL'
+Default symbol: [.]
+New symbol: [_MS_]
+A number formatted with the new symbol: $12,345_MS_12
+
+Symbol 'EXPONENTIAL_SYMBOL'
+Default symbol: [E]
+New symbol: [_E_]
+A number formatted with the new symbol: 1.2345123456_E_4
+
+Symbol 'PERMILL_SYMBOL'
+Default symbol: [‰]
+New symbol: [_PS_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'PAD_ESCAPE_SYMBOL'
+Default symbol: [*]
+New symbol: [_PE_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'INFINITY_SYMBOL'
+Default symbol: [∞]
+New symbol: [_IS_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'NAN_SYMBOL'
+Default symbol: [NaN]
+New symbol: [_N_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'SIGNIFICANT_DIGIT_SYMBOL'
+Default symbol: [@]
+New symbol: [_SD_]
+A number formatted with the new symbol: 12,345.123
+
+Symbol 'MONETARY_GROUPING_SEPARATOR_SYMBOL'
+Default symbol: [,]
+New symbol: [_MG_]
+A number formatted with the new symbol: $12_MG_345.12
+
+Symbol 'MONETARY_GROUPING_SEPARATOR_SYMBOL-2'
+Default symbol: [,]
+New symbol: [&nbsp;]
+A number formatted with the new symbol: $12&nbsp;345.12
+
+Symbol 'MONETARY_GROUPING_SEPARATOR_SYMBOL-3'
+Default symbol: [,]
+New symbol: [blahblahblahblahblahblahblahblahblahblah]
+A number formatted with the new symbol: $12blahblahblahblahblahblahblahblahblahblah345.12
+
Index: ext/intl/tests/collator_create2.phpt
===================================================================
--- ext/intl/tests/collator_create2.phpt	(revision 0)
+++ ext/intl/tests/collator_create2.phpt	(revision 0)
@@ -0,0 +1,82 @@
+--TEST--
+create() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try creating collator with different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $locales = array(
+        'EN-US-ODESSA',
+        'UK_UA_ODESSA',
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        '',
+        'root',
+        'uk@currency=EURO',
+	'1234567891113151719212325272931333537394143454749515357596163656769717375777981838587899193959799'
+    );
+
+    foreach( $locales as $locale )
+    {
+        // Create Collator with the current locale.
+        $coll = ut_coll_create( $locale );
+        if( !is_object($coll) )
+        {
+            $res_str .= "Error creating collator with '$locale' locale: " .
+                 intl_get_error_message() . "\n";
+            continue;
+        }
+
+        // Get the requested, valid and actual locales.
+        $vloc = ut_coll_get_locale( $coll, Locale::VALID_LOCALE );
+        $aloc = ut_coll_get_locale( $coll, Locale::ACTUAL_LOCALE );
+
+        // Show them.
+        $res_str .= "Locale: '$locale'\n" .
+            "  ULOC_REQUESTED_LOCALE = '$locale'\n" .
+            "  ULOC_VALID_LOCALE     = '$vloc'\n" .
+            "  ULOC_ACTUAL_LOCALE    = '$aloc'\n";
+    }
+
+    return $res_str;
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTF--
+Locale: 'EN-US-ODESSA'
+  ULOC_REQUESTED_LOCALE = 'EN-US-ODESSA'
+  ULOC_VALID_LOCALE     = 'en_US'
+  ULOC_ACTUAL_LOCALE    = 'root'
+Locale: 'UK_UA_ODESSA'
+  ULOC_REQUESTED_LOCALE = 'UK_UA_ODESSA'
+  ULOC_VALID_LOCALE     = 'uk_UA'
+  ULOC_ACTUAL_LOCALE    = 'uk'
+Locale: 'uk-ua_CALIFORNIA@currency=;currency=GRN'
+  ULOC_REQUESTED_LOCALE = 'uk-ua_CALIFORNIA@currency=;currency=GRN'
+  ULOC_VALID_LOCALE     = 'uk_UA'
+  ULOC_ACTUAL_LOCALE    = 'uk'
+Locale: ''
+  ULOC_REQUESTED_LOCALE = ''
+  ULOC_VALID_LOCALE     = '%s'
+  ULOC_ACTUAL_LOCALE    = '%s'
+Locale: 'root'
+  ULOC_REQUESTED_LOCALE = 'root'
+  ULOC_VALID_LOCALE     = 'root'
+  ULOC_ACTUAL_LOCALE    = 'root'
+Locale: 'uk@currency=EURO'
+  ULOC_REQUESTED_LOCALE = 'uk@currency=EURO'
+  ULOC_VALID_LOCALE     = 'uk'
+  ULOC_ACTUAL_LOCALE    = 'uk'
+Error creating collator with '1234567891113151719212325272931333537394143454749515357596163656769717375777981838587899193959799' locale: Locale string too long, should be no longer than 80 characters: U_ILLEGAL_ARGUMENT_ERROR
Index: ext/intl/tests/locale_parse_locale2.phpt
===================================================================
--- ext/intl/tests/locale_parse_locale2.phpt	(revision 0)
+++ ext/intl/tests/locale_parse_locale2.phpt	(revision 0)
@@ -0,0 +1,203 @@
+--TEST--
+locale_parse_locale() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try parsing different Locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $locales = array(
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $arr = ut_loc_locale_parse( $locale);
+        $res_str .= "---------------------\n";
+        $res_str .= "$locale:\n";
+        if( $arr){
+            foreach( $arr as $key => $value){
+                    $res_str .= "$key : '$value' , ";
+            }
+            $res_str = rtrim($res_str);
+        }
+        else{
+            $res_str .= "No values found from Locale parsing.";
+        }
+        $res_str .= "\n";
+    }
+
+    $res_str .= "\n";
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTF--
+---------------------
+uk-ua_CALIFORNIA@currency=;currency=GRN:
+language : 'uk' , region : 'UA' , variant0 : 'CALIFORNIA' ,
+---------------------
+root:
+language : 'root' ,
+---------------------
+uk@currency=EURO:
+language : 'uk' ,
+---------------------
+Hindi:
+language : 'hindi' ,
+---------------------
+de:
+language : 'de' ,
+---------------------
+fr:
+language : 'fr' ,
+---------------------
+ja:
+language : 'ja' ,
+---------------------
+i-enochian:
+grandfathered : 'i-enochian' ,
+---------------------
+zh-Hant:
+language : 'zh' , script : 'Hant' ,
+---------------------
+zh-Hans:
+language : 'zh' , script : 'Hans' ,
+---------------------
+sr-Cyrl:
+language : 'sr' , script : 'Cyrl' ,
+---------------------
+sr-Latn:
+language : 'sr' , script : 'Latn' ,
+---------------------
+zh-Hans-CN:
+language : 'zh' , script : 'Hans' , region : 'CN' ,
+---------------------
+sr-Latn-CS:
+language : 'sr' , script : 'Latn' , region : 'CS' ,
+---------------------
+sl-rozaj:
+language : 'sl' , variant0 : 'ROZAJ' ,
+---------------------
+sl-nedis:
+language : 'sl' , variant0 : 'NEDIS' ,
+---------------------
+de-CH-1901:
+language : 'de' , region : 'CH' , variant0 : '1901' ,
+---------------------
+sl-IT-nedis:
+language : 'sl' , region : 'IT' , variant0 : 'NEDIS' ,
+---------------------
+sl-Latn-IT-nedis:
+language : 'sl' , script : 'Latn' , region : 'IT' , variant0 : 'NEDIS' ,
+---------------------
+de-DE:
+language : 'de' , region : 'DE' ,
+---------------------
+en-US:
+language : 'en' , region : 'US' ,
+---------------------
+es-419:
+language : 'es' , region : '419' ,
+---------------------
+de-CH-x-phonebk:
+language : 'de' , region : 'CH' , private0 : 'phonebk' ,
+---------------------
+az-Arab-x-AZE-derbend:
+language : 'az' , script : 'Arab' , private0 : 'AZE' , private1 : 'derbend' ,
+---------------------
+zh-min:
+grandfathered : 'zh-min' ,
+---------------------
+zh-min-nan-Hant-CN:
+language : 'zh' , region : 'MIN' , variant0 : 'NAN' , variant1 : 'HANT' , variant2 : 'CN' ,
+---------------------
+qaa-Qaaa-QM-x-southern:
+language : 'qaa' , script : 'Qaaa' , region : 'QM' , private0 : 'southern' ,
+---------------------
+sr-Latn-QM:
+language : 'sr' , script : 'Latn' , region : 'QM' ,
+---------------------
+sr-Qaaa-CS:
+language : 'sr' , script : 'Qaaa' , region : 'CS' ,
+---------------------
+en-US-u-islamCal:
+language : 'en' , region : 'US' ,
+---------------------
+zh-CN-a-myExt-x-private:
+language : 'zh' , region : 'CN' , private0 : 'private' ,
+---------------------
+en-a-myExt-b-another:
+language : 'en' ,
+---------------------
+de-419-DE:
+language : 'de' , region : '419' , variant0 : 'DE' ,
+---------------------
+a-DE:
+No values found from Locale parsing.
+---------------------
+ar-a-aaa-b-bbb-a-ccc:
+language : 'ar' ,
Index: ext/intl/tests/formatter_format_currency2.phpt
===================================================================
--- ext/intl/tests/formatter_format_currency2.phpt	(revision 0)
+++ ext/intl/tests/formatter_format_currency2.phpt	(revision 0)
@@ -0,0 +1,50 @@
+--TEST--
+numfmt_format_currency() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Format a number using misc currencies/locales.
+ */
+/*
+ * TODO: doesn't pass on ICU 3.6 because 'ru' and 'uk' locales changed
+ * currency formatting.
+ */
+
+
+function ut_main()
+{
+    $locales = array(
+        'en_UK' => 'GBP',
+        'en_US' => 'USD',
+        'ru'    => 'RUR',
+        'uk'    => 'UAH',
+        'en'    => 'UAH'
+    );
+
+    $res_str = '';
+    $number = 1234567.89;
+
+    foreach( $locales as $locale => $currency )
+    {
+        $fmt = ut_nfmt_create( $locale, NumberFormatter::CURRENCY );
+        $res_str .= "$locale: " . var_export( ut_nfmt_format_currency( $fmt, $number, $currency ), true ) . "\n";
+    }
+    return $res_str;
+}
+
+include_once( 'ut_common.inc' );
+
+// Run the test
+ut_run();
+
+?>
+--EXPECT--
+en_UK: '£1,234,567.89'
+en_US: '$1,234,567.89'
+ru: '1 234 567,89 р.'
+uk: '1 234 567,89 ₴'
+en: 'UAH1,234,567.89'
Index: ext/intl/tests/locale_get_display_region2.phpt
===================================================================
--- ext/intl/tests/locale_get_display_region2.phpt	(revision 0)
+++ ext/intl/tests/locale_get_display_region2.phpt	(revision 0)
@@ -0,0 +1,275 @@
+--TEST--
+locale_get_display_region() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try getting the display_region for different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $disp_locales=array('en','fr','de');
+
+    $locales = array(
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'x-whatever',
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $res_str .= "locale='$locale'\n";
+        foreach( $disp_locales as $disp_locale )
+        {
+            $scr = ut_loc_get_display_region( $locale ,$disp_locale );
+            $res_str .= "disp_locale=$disp_locale :  display_region=$scr";
+            $res_str .= "\n";
+        }
+        $res_str .= "-----------------\n";
+    }
+
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTREGEX--
+locale='uk-ua_CALIFORNIA@currency=;currency=GRN'
+disp_locale=en :  display_region=Ukraine
+disp_locale=fr :  display_region=Ukraine
+disp_locale=de :  display_region=Ukraine
+-----------------
+locale='root'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='uk@currency=EURO'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='Hindi'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='de'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='fr'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='ja'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='i-enochian'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='zh-Hant'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='zh-Hans'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='sr-Cyrl'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='sr-Latn'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='zh-Hans-CN'
+disp_locale=en :  display_region=China
+disp_locale=fr :  display_region=Chine
+disp_locale=de :  display_region=China
+-----------------
+locale='sr-Latn-CS'
+disp_locale=en :  display_region=Serbia [Aa]nd Montenegro
+disp_locale=fr :  display_region=Serbie-et-Monténégro
+disp_locale=de :  display_region=Serbien und Montenegro
+-----------------
+locale='sl-rozaj'
+disp_locale=en :  display_region=(ROZAJ)?
+disp_locale=fr :  display_region=(ROZAJ)?
+disp_locale=de :  display_region=(ROZAJ)?
+-----------------
+locale='sl-nedis'
+disp_locale=en :  display_region=(NEDIS)?
+disp_locale=fr :  display_region=(NEDIS)?
+disp_locale=de :  display_region=(NEDIS)?
+-----------------
+locale='de-CH-1901'
+disp_locale=en :  display_region=Switzerland
+disp_locale=fr :  display_region=Suisse
+disp_locale=de :  display_region=Schweiz
+-----------------
+locale='sl-IT-nedis'
+disp_locale=en :  display_region=Italy
+disp_locale=fr :  display_region=Italie
+disp_locale=de :  display_region=Italien
+-----------------
+locale='sl-Latn-IT-nedis'
+disp_locale=en :  display_region=Italy
+disp_locale=fr :  display_region=Italie
+disp_locale=de :  display_region=Italien
+-----------------
+locale='de-DE'
+disp_locale=en :  display_region=Germany
+disp_locale=fr :  display_region=Allemagne
+disp_locale=de :  display_region=Deutschland
+-----------------
+locale='en-US'
+disp_locale=en :  display_region=United States
+disp_locale=fr :  display_region=États-Unis
+disp_locale=de :  display_region=Vereinigte Staaten
+-----------------
+locale='es-419'
+disp_locale=en :  display_region=Latin America
+disp_locale=fr :  display_region=Amérique latine
+disp_locale=de :  display_region=Lateinamerika
+-----------------
+locale='de-CH-x-phonebk'
+disp_locale=en :  display_region=Switzerland
+disp_locale=fr :  display_region=Suisse
+disp_locale=de :  display_region=Schweiz
+-----------------
+locale='az-Arab-x-AZE-derbend'
+disp_locale=en :  display_region=X?
+disp_locale=fr :  display_region=X?
+disp_locale=de :  display_region=X?
+-----------------
+locale='zh-min'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='zh-min-nan-Hant-CN'
+disp_locale=en :  display_region=MIN
+disp_locale=fr :  display_region=MIN
+disp_locale=de :  display_region=MIN
+-----------------
+locale='x-whatever'
+disp_locale=en :  display_region=
+disp_locale=fr :  display_region=
+disp_locale=de :  display_region=
+-----------------
+locale='qaa-Qaaa-QM-x-southern'
+disp_locale=en :  display_region=QM
+disp_locale=fr :  display_region=QM
+disp_locale=de :  display_region=QM
+-----------------
+locale='sr-Latn-QM'
+disp_locale=en :  display_region=QM
+disp_locale=fr :  display_region=QM
+disp_locale=de :  display_region=QM
+-----------------
+locale='sr-Qaaa-CS'
+disp_locale=en :  display_region=Serbia [Aa]nd Montenegro
+disp_locale=fr :  display_region=Serbie-et-Monténégro
+disp_locale=de :  display_region=Serbien und Montenegro
+-----------------
+locale='en-US-u-islamCal'
+disp_locale=en :  display_region=United States
+disp_locale=fr :  display_region=États-Unis
+disp_locale=de :  display_region=Vereinigte Staaten
+-----------------
+locale='zh-CN-a-myExt-x-private'
+disp_locale=en :  display_region=China
+disp_locale=fr :  display_region=Chine
+disp_locale=de :  display_region=China
+-----------------
+locale='en-a-myExt-b-another'
+disp_locale=en :  display_region=A?
+disp_locale=fr :  display_region=A?
+disp_locale=de :  display_region=A?
+-----------------
+locale='de-419-DE'
+disp_locale=en :  display_region=Latin America
+disp_locale=fr :  display_region=Amérique latine
+disp_locale=de :  display_region=Lateinamerika
+-----------------
+locale='a-DE'
+disp_locale=en :  display_region=Germany
+disp_locale=fr :  display_region=Allemagne
+disp_locale=de :  display_region=Deutschland
+-----------------
+locale='ar-a-aaa-b-bbb-a-ccc'
+disp_locale=en :  display_region=A?
+disp_locale=fr :  display_region=A?
+disp_locale=de :  display_region=A?
+-----------------
Index: ext/intl/tests/msgfmt_fail2.phpt
===================================================================
--- ext/intl/tests/msgfmt_fail2.phpt	(revision 0)
+++ ext/intl/tests/msgfmt_fail2.phpt	(revision 0)
@@ -0,0 +1,102 @@
+--TEST--
+msgfmt creation failures icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+function err($fmt) {
+	if(!$fmt) {
+		echo var_export(intl_get_error_message(), true)."\n";
+	}
+}
+
+function crt($t, $l, $s) {
+	switch(true) {
+		case $t == "O":
+			return new MessageFormatter($l, $s);
+			break;
+		case $t == "C":
+			return MessageFormatter::create($l, $s);
+			break;
+		case $t == "P":
+			return msgfmt_create($l, $s);
+			break;
+	}
+}
+
+$args = array(
+	array(null, null),
+	array("whatever", "{0,whatever}"),
+	array(array(), array()),
+	array("en", "{0,choice}"),
+	array("fr", "{0,"),
+	array("en_US", "\xD0"),
+);
+
+$fmt = new MessageFormatter();
+err($fmt); 
+$fmt = msgfmt_create();
+err($fmt); 
+$fmt = MessageFormatter::create();
+err($fmt); 
+$fmt = new MessageFormatter('en');
+err($fmt); 
+$fmt = msgfmt_create('en');
+err($fmt); 
+$fmt = MessageFormatter::create('en');
+err($fmt); 
+
+foreach($args as $arg) {
+	$fmt = crt("O", $arg[0], $arg[1]);
+	err($fmt);
+	$fmt = crt("C", $arg[0], $arg[1]);
+	err($fmt);
+	$fmt = crt("P", $arg[0], $arg[1]);
+	err($fmt);
+}
+
+?>
+--EXPECTF--
+Warning: MessageFormatter::__construct() expects exactly 2 parameters, 0 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: msgfmt_create() expects exactly 2 parameters, 0 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: MessageFormatter::create() expects exactly 2 parameters, 0 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: MessageFormatter::__construct() expects exactly 2 parameters, 1 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: msgfmt_create() expects exactly 2 parameters, 1 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: MessageFormatter::create() expects exactly 2 parameters, 1 given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: MessageFormatter::__construct() expects parameter 1 to be string, array given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: MessageFormatter::create() expects parameter 1 to be string, array given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+
+Warning: msgfmt_create() expects parameter 1 to be string, array given in %s on line %d
+'msgfmt_create: unable to parse input parameters: U_ILLEGAL_ARGUMENT_ERROR'
+'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR'
+'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR'
+'msgfmt_create: message formatter creation failed: U_PATTERN_SYNTAX_ERROR'
+'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES'
+'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES'
+'msgfmt_create: message formatter creation failed: U_UNMATCHED_BRACES'
+'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND'
+'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND'
+'msgfmt_create: error converting pattern to UTF-16: U_INVALID_CHAR_FOUND'
Index: ext/intl/tests/formatter_get_set_attribute2.phpt
===================================================================
--- ext/intl/tests/formatter_get_set_attribute2.phpt	(revision 0)
+++ ext/intl/tests/formatter_get_set_attribute2.phpt	(revision 0)
@@ -0,0 +1,194 @@
+--TEST--
+numfmt_get/set_attribute() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Get/set various number formatting attributes.
+ */
+
+
+function ut_main()
+{
+    // attr_name => array( attr, value )
+    $attributes = array(
+        'PARSE_INT_ONLY' => array( NumberFormatter::PARSE_INT_ONLY, 1, 12345.123456 ),
+        'GROUPING_USED' => array( NumberFormatter::GROUPING_USED, 0, 12345.123456 ),
+        'DECIMAL_ALWAYS_SHOWN' => array( NumberFormatter::DECIMAL_ALWAYS_SHOWN, 1, 12345 ),
+        'MAX_INTEGER_DIGITS' => array( NumberFormatter::MAX_INTEGER_DIGITS, 2, 12345.123456 ),
+        'MIN_INTEGER_DIGITS' => array( NumberFormatter::MIN_INTEGER_DIGITS, 20, 12345.123456 ),
+        'INTEGER_DIGITS' => array( NumberFormatter::INTEGER_DIGITS, 7, 12345.123456 ),
+        'MAX_FRACTION_DIGITS' => array( NumberFormatter::MAX_FRACTION_DIGITS, 2, 12345.123456 ),
+        'MIN_FRACTION_DIGITS' => array( NumberFormatter::MIN_FRACTION_DIGITS, 20, 12345.123456 ),
+        'FRACTION_DIGITS' => array( NumberFormatter::FRACTION_DIGITS, 5, 12345.123456 ),
+        'MULTIPLIER' => array( NumberFormatter::MULTIPLIER, 2, 12345.123456 ),
+        'GROUPING_SIZE' => array( NumberFormatter::GROUPING_SIZE, 2, 12345.123456 ),
+        'ROUNDING_MODE' => array( NumberFormatter::ROUNDING_MODE, 1, 12345.123456 ),
+        'ROUNDING_INCREMENT' => array( NumberFormatter::ROUNDING_INCREMENT, (float)2, 12345.123456 ),
+        'FORMAT_WIDTH' => array( NumberFormatter::FORMAT_WIDTH, 27, 12345.123456 ),
+        'PADDING_POSITION' => array( NumberFormatter::PADDING_POSITION, 21, 12345.123456 ),
+        'SECONDARY_GROUPING_SIZE' => array( NumberFormatter::SECONDARY_GROUPING_SIZE, 2, 12345.123456 ),
+        'SIGNIFICANT_DIGITS_USED' => array( NumberFormatter::SIGNIFICANT_DIGITS_USED, 1, 12345.123456 ),
+        'MIN_SIGNIFICANT_DIGITS' => array( NumberFormatter::MIN_SIGNIFICANT_DIGITS, 3, 1 ),
+        'MAX_SIGNIFICANT_DIGITS' => array( NumberFormatter::MAX_SIGNIFICANT_DIGITS, 4, 12345.123456 ),
+        // 'LENIENT_PARSE' => array( NumberFormatter::LENIENT_PARSE, 2, 12345.123456 )
+    );
+
+    $res_str = '';
+
+    $fmt = ut_nfmt_create( "en_US", NumberFormatter::DECIMAL );
+
+    foreach( $attributes as $attr_name => $args )
+    {
+        list( $attr, $new_val, $number ) = $args;
+        $res_str .= "\nAttribute $attr_name\n";
+
+        // Get original value of the attribute.
+        $orig_val = ut_nfmt_get_attribute( $fmt, $attr );
+
+        // Format the number using the original attribute value.
+        $rc = ut_nfmt_format( $fmt, $number );
+
+        $ps = ut_nfmt_parse( $fmt, $rc );
+
+        $res_str .= sprintf( "Old attribute value: %s ;  Format result: %s ; Parse result: %s\n",
+                             dump( $orig_val ),
+                             dump( $rc ),
+                             dump( $ps ) );
+
+        // Set new attribute value.
+        $rc = ut_nfmt_set_attribute( $fmt, $attr, $new_val );
+        if( $rc )
+            $res_str .= "Setting attribute: ok\n";
+        else
+            $res_str .= sprintf( "Setting attribute failed: %s\n", ut_nfmt_get_error_message( $fmt ) );
+
+        // Format the number using the new value.
+        $rc = ut_nfmt_format( $fmt, $number );
+
+        // Get current value of the attribute and check if it equals $new_val.
+        $attr_val_check = ut_nfmt_get_attribute( $fmt, $attr );
+        if( $attr_val_check !== $new_val )
+            $res_str .= "ERROR: New $attr_name attribute value has not been set correctly.\n";
+
+        $ps = ut_nfmt_parse( $fmt, $rc );
+
+        $res_str .= sprintf( "New attribute value: %s ;  Format result: %s ; Parse result: %s\n",
+                             dump( $new_val ),
+                             dump( $rc ),
+                             dump( $ps ) );
+
+
+        // Restore original attribute of the  value
+        if( $attr != NumberFormatter::INTEGER_DIGITS && $attr != NumberFormatter::FRACTION_DIGITS
+             && $attr != NumberFormatter::FORMAT_WIDTH && $attr != NumberFormatter::SIGNIFICANT_DIGITS_USED )
+            ut_nfmt_set_attribute( $fmt, $attr, $orig_val );
+    }
+
+    return $res_str;
+}
+
+include_once( 'ut_common.inc' );
+
+// Run the test
+ut_run();
+
+?>
+--EXPECT--
+Attribute PARSE_INT_ONLY
+Old attribute value: 0 ;  Format result: '12,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 1 ;  Format result: '12,345.123' ; Parse result: 12345
+
+Attribute GROUPING_USED
+Old attribute value: 1 ;  Format result: '12,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 0 ;  Format result: '12345.123' ; Parse result: 12345.123
+
+Attribute DECIMAL_ALWAYS_SHOWN
+Old attribute value: 0 ;  Format result: '12,345' ; Parse result: 12345
+Setting attribute: ok
+New attribute value: 1 ;  Format result: '12,345.' ; Parse result: 12345
+
+Attribute MAX_INTEGER_DIGITS
+Old attribute value: 309 ;  Format result: '12,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '45.123' ; Parse result: 45.123
+
+Attribute MIN_INTEGER_DIGITS
+Old attribute value: 1 ;  Format result: '12,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 20 ;  Format result: '00,000,000,000,000,012,345.123' ; Parse result: 12345.123
+
+Attribute INTEGER_DIGITS
+Old attribute value: 1 ;  Format result: '12,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 7 ;  Format result: '0,012,345.123' ; Parse result: 12345.123
+
+Attribute MAX_FRACTION_DIGITS
+Old attribute value: 3 ;  Format result: '0,012,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '0,012,345.12' ; Parse result: 12345.12
+
+Attribute MIN_FRACTION_DIGITS
+Old attribute value: 0 ;  Format result: '0,012,345.123' ; Parse result: 12345.123
+Setting attribute: ok
+New attribute value: 20 ;  Format result: '0,012,345.12345600000000000000' ; Parse result: 12345.123456
+
+Attribute FRACTION_DIGITS
+Old attribute value: 0 ;  Format result: '0,012,345.123456' ; Parse result: 12345.123456
+Setting attribute: ok
+New attribute value: 5 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+
+Attribute MULTIPLIER
+Old attribute value: 1 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '0,024,690.24691' ; Parse result: 12345.123455
+
+Attribute GROUPING_SIZE
+Old attribute value: 3 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '0,01,23,45.12346' ; Parse result: 12345.12346
+
+Attribute ROUNDING_MODE
+Old attribute value: 4 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 1 ;  Format result: '0,012,345.12345' ; Parse result: 12345.12345
+
+Attribute ROUNDING_INCREMENT
+Old attribute value: 0 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '0,012,346.00000' ; Parse result: 12346
+
+Attribute FORMAT_WIDTH
+Old attribute value: 0 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 27 ;  Format result: '************0,012,345.12346' ; Parse result: 12345.12346
+
+Attribute PADDING_POSITION
+Old attribute value: 0 ;  Format result: '************0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 21 ;  Format result: '0,012,345.12346' ; Parse result: 12345.12346
+
+Attribute SECONDARY_GROUPING_SIZE
+Old attribute value: 0 ;  Format result: '************0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 2 ;  Format result: '************00,12,345.12346' ; Parse result: 12345.12346
+
+Attribute SIGNIFICANT_DIGITS_USED
+Old attribute value: 0 ;  Format result: '************0,012,345.12346' ; Parse result: 12345.12346
+Setting attribute: ok
+New attribute value: 1 ;  Format result: '*******************12,345.1' ; Parse result: 12345.1
+
+Attribute MIN_SIGNIFICANT_DIGITS
+Old attribute value: 1 ;  Format result: '**************************1' ; Parse result: 1
+Setting attribute: ok
+New attribute value: 3 ;  Format result: '***********************1.00' ; Parse result: 1
+
+Attribute MAX_SIGNIFICANT_DIGITS
+Old attribute value: 6 ;  Format result: '*******************12,345.1' ; Parse result: 12345.1
+Setting attribute: ok
+New attribute value: 4 ;  Format result: '*********************12,350' ; Parse result: 12350
Index: ext/intl/tests/dateformat_clone2.phpt
===================================================================
--- ext/intl/tests/dateformat_clone2.phpt	(revision 0)
+++ ext/intl/tests/dateformat_clone2.phpt	(revision 0)
@@ -0,0 +1,37 @@
+--TEST--
+Cloning datefmt icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+include_once( 'ut_common.inc' );
+$GLOBALS['oo-mode'] = true;
+$res_str = '';
+/*
+ * Clone
+ */
+$start_pattern = 'dd-MM-YY';
+$fmt = ut_datefmt_create( "en-US",  IntlDateFormatter::FULL, IntlDateFormatter::FULL, 'America/New_York', IntlDateFormatter::GREGORIAN , $start_pattern );
+
+$formatted = ut_datefmt_format($fmt,0);
+$res_str .= "\nResult of formatting timestamp=0 is :  \n$formatted";
+
+$fmt_clone = clone $fmt;
+ut_datefmt_set_pattern( $fmt , 'yyyy-DDD.hh:mm:ss z' );
+
+$formatted = ut_datefmt_format($fmt,0);
+$res_str .= "\nResult of formatting timestamp=0 is :  \n$formatted";
+$formatted = ut_datefmt_format($fmt_clone,0);
+$res_str .= "\nResult of clone formatting timestamp=0 is :  \n$formatted";
+
+echo $res_str;
+
+?>
+--EXPECTF--
+Result of formatting timestamp=0 is :  
+31-12-70
+Result of formatting timestamp=0 is :  
+1969-365.07:00:00 EST
+Result of clone formatting timestamp=0 is :  
+31-12-70
Index: ext/intl/tests/locale_get_display_variant2.phpt
===================================================================
--- ext/intl/tests/locale_get_display_variant2.phpt	(revision 0)
+++ ext/intl/tests/locale_get_display_variant2.phpt	(revision 0)
@@ -0,0 +1,275 @@
+--TEST--
+locale_get_display_variant() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try getting the display_variant for different locales
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+    $res_str = '';
+
+    $disp_locales=array('en','fr','de');
+
+    $locales = array(
+        'uk-ua_CALIFORNIA@currency=;currency=GRN',
+        'root',
+        'uk@currency=EURO',
+        'Hindi',
+//Simple language subtag
+        'de',
+        'fr',
+        'ja',
+        'i-enochian', //(example of a grandfathered tag)
+//Language subtag plus Script subtag:
+        'zh-Hant',
+        'zh-Hans',
+        'sr-Cyrl',
+        'sr-Latn',
+//Language-Script-Region
+        'zh-Hans-CN',
+        'sr-Latn-CS',
+//Language-Variant
+        'sl-rozaj',
+        'sl-nedis',
+//Language-Region-Variant
+        'de-CH-1901',
+        'sl-IT-nedis',
+//Language-Script-Region-Variant
+        'sl-Latn-IT-nedis',
+//Language-Region:
+        'de-DE',
+        'en-US',
+        'es-419',
+//Private use subtags:
+        'de-CH-x-phonebk',
+        'az-Arab-x-AZE-derbend',
+//Extended language subtags
+        'zh-min',
+        'zh-min-nan-Hant-CN',
+//Private use registry values
+        'x-whatever',
+        'qaa-Qaaa-QM-x-southern',
+        'sr-Latn-QM',
+        'sr-Qaaa-CS',
+/*Tags that use extensions (examples ONLY: extensions MUST be defined
+   by revision or update to this document or by RFC): */
+        'en-US-u-islamCal',
+        'zh-CN-a-myExt-x-private',
+        'en-a-myExt-b-another',
+//Some Invalid Tags:
+        'de-419-DE',
+        'a-DE',
+        'ar-a-aaa-b-bbb-a-ccc'
+    );
+
+
+    $res_str = '';
+
+    foreach( $locales as $locale )
+    {
+        $res_str .= "locale='$locale'\n";
+        foreach( $disp_locales as $disp_locale )
+        {
+            $scr = ut_loc_get_display_variant( $locale ,$disp_locale );
+            $res_str .= "disp_locale=$disp_locale :  display_variant=$scr";
+            $res_str .= "\n";
+        }
+        $res_str .= "-----------------\n";
+    }
+
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECTREGEX--
+locale='uk-ua_CALIFORNIA@currency=;currency=GRN'
+disp_locale=en :  display_variant=CALIFORNIA
+disp_locale=fr :  display_variant=CALIFORNIA
+disp_locale=de :  display_variant=CALIFORNIA
+-----------------
+locale='root'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='uk@currency=EURO'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='Hindi'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='de'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='fr'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='ja'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='i-enochian'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='zh-Hant'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='zh-Hans'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sr-Cyrl'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sr-Latn'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='zh-Hans-CN'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sr-Latn-CS'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sl-rozaj'
+disp_locale=en :  display_variant=Resian
+disp_locale=fr :  display_variant=dialecte de Resia
+disp_locale=de :  display_variant=Resianisch
+-----------------
+locale='sl-nedis'
+disp_locale=en :  display_variant=Natisone dialect
+disp_locale=fr :  display_variant=dialecte de Natisone
+disp_locale=de :  display_variant=Natisone-Dialekt
+-----------------
+locale='de-CH-1901'
+disp_locale=en :  display_variant=Traditional German orthography
+disp_locale=fr :  display_variant=orthographe allemande traditionnelle
+disp_locale=de :  display_variant=(1901|[Aa]lte deutsche Rechtschreibung)
+-----------------
+locale='sl-IT-nedis'
+disp_locale=en :  display_variant=Natisone dialect
+disp_locale=fr :  display_variant=dialecte de Natisone
+disp_locale=de :  display_variant=(NEDIS|Natisone-Dialekt)
+-----------------
+locale='sl-Latn-IT-nedis'
+disp_locale=en :  display_variant=Natisone dialect
+disp_locale=fr :  display_variant=dialecte de Natisone
+disp_locale=de :  display_variant=(NEDIS|Natisone-Dialekt)
+-----------------
+locale='de-DE'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='en-US'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='es-419'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='de-CH-x-phonebk'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='az-Arab-x-AZE-derbend'
+disp_locale=en :  display_variant=(AZE_DERBEND)?
+disp_locale=fr :  display_variant=(AZE_DERBEND)?
+disp_locale=de :  display_variant=(AZE_DERBEND)?
+-----------------
+locale='zh-min'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='zh-min-nan-Hant-CN'
+disp_locale=en :  display_variant=NAN_HANT_CN
+disp_locale=fr :  display_variant=NAN_HANT_CN
+disp_locale=de :  display_variant=NAN_HANT_CN
+-----------------
+locale='x-whatever'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='qaa-Qaaa-QM-x-southern'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sr-Latn-QM'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='sr-Qaaa-CS'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='en-US-u-islamCal'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='zh-CN-a-myExt-x-private'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='en-a-myExt-b-another'
+disp_locale=en :  display_variant=(MYEXT_B_ANOTHER)?
+disp_locale=fr :  display_variant=(MYEXT_B_ANOTHER)?
+disp_locale=de :  display_variant=(MYEXT_B_ANOTHER)?
+-----------------
+locale='de-419-DE'
+disp_locale=en :  display_variant=DE
+disp_locale=fr :  display_variant=DE
+disp_locale=de :  display_variant=DE
+-----------------
+locale='a-DE'
+disp_locale=en :  display_variant=
+disp_locale=fr :  display_variant=
+disp_locale=de :  display_variant=
+-----------------
+locale='ar-a-aaa-b-bbb-a-ccc'
+disp_locale=en :  display_variant=(AAA_B_BBB_A_CCC)?
+disp_locale=fr :  display_variant=(AAA_B_BBB_A_CCC)?
+disp_locale=de :  display_variant=(AAA_B_BBB_A_CCC)?
+-----------------
Index: ext/intl/tests/locale_filter_matches2.phpt
===================================================================
--- ext/intl/tests/locale_filter_matches2.phpt	(revision 0)
+++ ext/intl/tests/locale_filter_matches2.phpt	(revision 0)
@@ -0,0 +1,366 @@
+--TEST--
+locale_filter_matches.phpt() icu >= 4.8
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+<?php if(version_compare(INTL_ICU_VERSION, '4.8') < 0) print 'skip'; ?>
+--FILE--
+<?php
+
+/*
+ * Try parsing different Locales  
+ * with Procedural and Object methods.
+ */
+
+function ut_main()
+{
+	$loc_ranges = array(
+		'de-de',
+		'sl_IT',
+		'sl_IT_Nedis',
+		'jbo',
+		'art-lojban',
+		'sl_IT'
+	);
+	
+	$lang_tags = array(
+		'de-DEVA',
+		'de-DE-1996',
+		'de-DE',
+		'zh_Hans',
+		'de-CH-1996',
+		'sl_IT',
+		'sl_IT_nedis-a-kirti-x-xyz',
+		'sl_IT_rozaj',
+		'sl_IT_NEDIS_ROJAZ_1901',
+		'i-enochian',
+		'sgn-CH-de',
+		'art-lojban',
+		'i-lux',
+		'art-lojban',
+		'jbo',
+		'en_sl_IT'
+	);
+
+    $res_str = '';
+    $isCanonical = false;
+	foreach($loc_ranges as $loc_range){
+		foreach($lang_tags as $lang_tag){
+			$res_str .="--------------\n";
+			$result= ut_loc_locale_filter_matches( $lang_tag , $loc_range , $isCanonical);
+			$res_str .= "loc_range:$loc_range matches lang_tag $lang_tag ? ";
+			if( $result){	
+				$res_str .= "YES\n";
+			}else{
+				$res_str .= "NO\n";
+			}
+//canonicalized version
+			$result= ut_loc_locale_filter_matches( $lang_tag , $loc_range , !($isCanonical));
+			$can_loc_range = ut_loc_canonicalize($loc_range);
+			$can_lang_tag = ut_loc_canonicalize($lang_tag);
+			$res_str .= "loc_range:$can_loc_range canonically matches lang_tag $can_lang_tag ? ";
+			if( $result){	
+				$res_str .= "YES\n";
+			}else{
+				$res_str .= "NO\n";
+			}
+		}
+	}
+
+	$res_str .= "\n";
+    return $res_str;
+
+}
+
+include_once( 'ut_common.inc' );
+ut_run();
+
+?>
+--EXPECT--
+--------------
+loc_range:de-de matches lang_tag de-DEVA ? NO
+loc_range:de_DE canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:de-de matches lang_tag de-DE-1996 ? YES
+loc_range:de_DE canonically matches lang_tag de_DE_1996 ? YES
+--------------
+loc_range:de-de matches lang_tag de-DE ? YES
+loc_range:de_DE canonically matches lang_tag de_DE ? YES
+--------------
+loc_range:de-de matches lang_tag zh_Hans ? NO
+loc_range:de_DE canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:de-de matches lang_tag de-CH-1996 ? NO
+loc_range:de_DE canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:de-de matches lang_tag sl_IT ? NO
+loc_range:de_DE canonically matches lang_tag sl_IT ? NO
+--------------
+loc_range:de-de matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO
+loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO
+--------------
+loc_range:de-de matches lang_tag sl_IT_rozaj ? NO
+loc_range:de_DE canonically matches lang_tag sl_IT_ROZAJ ? NO
+--------------
+loc_range:de-de matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+loc_range:de_DE canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+--------------
+loc_range:de-de matches lang_tag i-enochian ? NO
+loc_range:de_DE canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:de-de matches lang_tag sgn-CH-de ? NO
+loc_range:de_DE canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:de-de matches lang_tag art-lojban ? NO
+loc_range:de_DE canonically matches lang_tag jbo ? NO
+--------------
+loc_range:de-de matches lang_tag i-lux ? NO
+loc_range:de_DE canonically matches lang_tag lb ? NO
+--------------
+loc_range:de-de matches lang_tag art-lojban ? NO
+loc_range:de_DE canonically matches lang_tag jbo ? NO
+--------------
+loc_range:de-de matches lang_tag jbo ? NO
+loc_range:de_DE canonically matches lang_tag jbo ? NO
+--------------
+loc_range:de-de matches lang_tag en_sl_IT ? NO
+loc_range:de_DE canonically matches lang_tag en_SL_IT ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DEVA ? NO
+loc_range:sl_IT canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DE-1996 ? NO
+loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DE ? NO
+loc_range:sl_IT canonically matches lang_tag de_DE ? NO
+--------------
+loc_range:sl_IT matches lang_tag zh_Hans ? NO
+loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-CH-1996 ? NO
+loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:sl_IT matches lang_tag sl_IT ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+--------------
+loc_range:sl_IT matches lang_tag i-enochian ? NO
+loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:sl_IT matches lang_tag sgn-CH-de ? NO
+loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:sl_IT matches lang_tag art-lojban ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag i-lux ? NO
+loc_range:sl_IT canonically matches lang_tag lb ? NO
+--------------
+loc_range:sl_IT matches lang_tag art-lojban ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag jbo ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag en_sl_IT ? NO
+loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag de-DEVA ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag de-DE-1996 ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE_1996 ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag de-DE ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag de_DE ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag zh_Hans ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag de-CH-1996 ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag sl_IT ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES
+loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES
+--------------
+loc_range:sl_IT_Nedis matches lang_tag sl_IT_rozaj ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_ROZAJ ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+loc_range:sl_IT_NEDIS canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+--------------
+loc_range:sl_IT_Nedis matches lang_tag i-enochian ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag sgn-CH-de ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag i-lux ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag lb ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag art-lojban ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag jbo ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT_Nedis matches lang_tag en_sl_IT ? NO
+loc_range:sl_IT_NEDIS canonically matches lang_tag en_SL_IT ? NO
+--------------
+loc_range:jbo matches lang_tag de-DEVA ? NO
+loc_range:jbo canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:jbo matches lang_tag de-DE-1996 ? NO
+loc_range:jbo canonically matches lang_tag de_DE_1996 ? NO
+--------------
+loc_range:jbo matches lang_tag de-DE ? NO
+loc_range:jbo canonically matches lang_tag de_DE ? NO
+--------------
+loc_range:jbo matches lang_tag zh_Hans ? NO
+loc_range:jbo canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:jbo matches lang_tag de-CH-1996 ? NO
+loc_range:jbo canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:jbo matches lang_tag sl_IT ? NO
+loc_range:jbo canonically matches lang_tag sl_IT ? NO
+--------------
+loc_range:jbo matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO
+--------------
+loc_range:jbo matches lang_tag sl_IT_rozaj ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_ROZAJ ? NO
+--------------
+loc_range:jbo matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+--------------
+loc_range:jbo matches lang_tag i-enochian ? NO
+loc_range:jbo canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:jbo matches lang_tag sgn-CH-de ? NO
+loc_range:jbo canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:jbo matches lang_tag art-lojban ? NO
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:jbo matches lang_tag i-lux ? NO
+loc_range:jbo canonically matches lang_tag lb ? NO
+--------------
+loc_range:jbo matches lang_tag art-lojban ? NO
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:jbo matches lang_tag jbo ? YES
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:jbo matches lang_tag en_sl_IT ? NO
+loc_range:jbo canonically matches lang_tag en_SL_IT ? NO
+--------------
+loc_range:art-lojban matches lang_tag de-DEVA ? NO
+loc_range:jbo canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:art-lojban matches lang_tag de-DE-1996 ? NO
+loc_range:jbo canonically matches lang_tag de_DE_1996 ? NO
+--------------
+loc_range:art-lojban matches lang_tag de-DE ? NO
+loc_range:jbo canonically matches lang_tag de_DE ? NO
+--------------
+loc_range:art-lojban matches lang_tag zh_Hans ? NO
+loc_range:jbo canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:art-lojban matches lang_tag de-CH-1996 ? NO
+loc_range:jbo canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:art-lojban matches lang_tag sl_IT ? NO
+loc_range:jbo canonically matches lang_tag sl_IT ? NO
+--------------
+loc_range:art-lojban matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? NO
+--------------
+loc_range:art-lojban matches lang_tag sl_IT_rozaj ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_ROZAJ ? NO
+--------------
+loc_range:art-lojban matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+loc_range:jbo canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? NO
+--------------
+loc_range:art-lojban matches lang_tag i-enochian ? NO
+loc_range:jbo canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:art-lojban matches lang_tag sgn-CH-de ? NO
+loc_range:jbo canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:art-lojban matches lang_tag art-lojban ? YES
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:art-lojban matches lang_tag i-lux ? NO
+loc_range:jbo canonically matches lang_tag lb ? NO
+--------------
+loc_range:art-lojban matches lang_tag art-lojban ? YES
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:art-lojban matches lang_tag jbo ? NO
+loc_range:jbo canonically matches lang_tag jbo ? YES
+--------------
+loc_range:art-lojban matches lang_tag en_sl_IT ? NO
+loc_range:jbo canonically matches lang_tag en_SL_IT ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DEVA ? NO
+loc_range:sl_IT canonically matches lang_tag de_Deva ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DE-1996 ? NO
+loc_range:sl_IT canonically matches lang_tag de_DE_1996 ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-DE ? NO
+loc_range:sl_IT canonically matches lang_tag de_DE ? NO
+--------------
+loc_range:sl_IT matches lang_tag zh_Hans ? NO
+loc_range:sl_IT canonically matches lang_tag zh_Hans ? NO
+--------------
+loc_range:sl_IT matches lang_tag de-CH-1996 ? NO
+loc_range:sl_IT canonically matches lang_tag de_CH_1996 ? NO
+--------------
+loc_range:sl_IT matches lang_tag sl_IT ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_nedis-a-kirti-x-xyz ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_A_KIRTI_X_XYZ ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_rozaj ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_ROZAJ ? YES
+--------------
+loc_range:sl_IT matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+loc_range:sl_IT canonically matches lang_tag sl_IT_NEDIS_ROJAZ_1901 ? YES
+--------------
+loc_range:sl_IT matches lang_tag i-enochian ? NO
+loc_range:sl_IT canonically matches lang_tag @x=i-enochian ? NO
+--------------
+loc_range:sl_IT matches lang_tag sgn-CH-de ? NO
+loc_range:sl_IT canonically matches lang_tag sgn_CH_DE ? NO
+--------------
+loc_range:sl_IT matches lang_tag art-lojban ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag i-lux ? NO
+loc_range:sl_IT canonically matches lang_tag lb ? NO
+--------------
+loc_range:sl_IT matches lang_tag art-lojban ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag jbo ? NO
+loc_range:sl_IT canonically matches lang_tag jbo ? NO
+--------------
+loc_range:sl_IT matches lang_tag en_sl_IT ? NO
+loc_range:sl_IT canonically matches lang_tag en_SL_IT ? NO
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Thu Apr 25 12:01:31 2024 UTC