Index: trunk/wp-includes/shortcodes.php
===================================================================
--- trunk/wp-includes/shortcodes.php	(revision 36998)
+++ trunk/wp-includes/shortcodes.php	(working copy)
@@ -95,7 +95,7 @@
 		return;
 	}
 
-	if ( 0 !== preg_match( '@[<>&/\[\]\x00-\x20=]@', $tag ) ) {
+	if ( 0 !== preg_match( '@[<>&/\[\]\s=]@u', $tag ) ) {
 		/* translators: 1: shortcode name, 2: space separated list of reserved characters */
 		$message = sprintf( __( 'Invalid shortcode name: %1$s. Do not use spaces or reserved characters: %2$s' ), $tag, '& / < > [ ] =' );
 		_doing_it_wrong( __FUNCTION__, $message, '4.4.0' );
@@ -210,7 +210,7 @@
 		return $content;
 
 	// Find all registered tag names in $content.
-	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
+	preg_match_all( '@\[([^<>&/\[\]\s=]++)@u', $content, $matches );
 	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
 
 	if ( empty( $tagnames ) ) {
@@ -481,6 +481,7 @@
 function shortcode_parse_atts($text) {
 	$atts = array();
 	$pattern = get_shortcode_atts_regex();
+	$text = preg_replace('/&#8221;|&#8243;/i',"\x22",$text);
 	$text = preg_replace("/[\x{00a0}\x{200b}]+/u", " ", $text);
 	if ( preg_match_all($pattern, $text, $match, PREG_SET_ORDER) ) {
 		foreach ($match as $m) {
@@ -578,7 +579,7 @@
 		return $content;
 
 	// Find all registered tag names in $content.
-	preg_match_all( '@\[([^<>&/\[\]\x00-\x20=]++)@', $content, $matches );
+	preg_match_all( '@\[([^<>&/\[\]\s=]++)@u', $content, $matches );
 	$tagnames = array_intersect( array_keys( $shortcode_tags ), $matches[1] );
 
 	if ( empty( $tagnames ) ) {
