Index: wp-includes/formatting.php
===================================================================
--- wp-includes/formatting.php	(revision 30976)
+++ wp-includes/formatting.php	(working copy)
@@ -264,6 +264,27 @@
 		} elseif ( '[' === $first && 1 === preg_match( '/^' . $shortcode_regex . '$/', $curl ) ) {
 			// This is a shortcode delimiter.
 
+			// Replace any curly quotes with straight quotes in shortcodes
+			$quote_search = array( '=“', '=”', '=‘', '=’', '“ ', '“]', '” ', '”]', '‘ ', '‘]', '’ ', '’]' );
+			$quote_replace = array( '="', '="', '=\'', '=\'', '" ', '"]', '" ', '"]', '\' ', '\']', '\' ', '\']' );
+			// Test it to be smart. Don't want to break the shortcode.	
+			$test_curl = str_replace( $quote_search, $quote_replace, $curl );
+			$test_atts = str_replace( array( '[', ']' ), '', $test_curl ); 
+			$test_atts = shortcode_parse_atts( $test_atts );
+			// Programmed to bail on clearing curly quotes if the shortcode's attributes have a $key of 1 or greater.
+			// $key of value 0 is the name of the shortcode. 
+			// All other $key values should be a string.
+			$bail = false;
+			foreach ($test_atts as $key => $value) {
+				if ( is_int( $key ) && $key > 0 ) {
+					$bail = true;
+					break;
+				}
+			}
+			if ( !$bail ) {
+				$curl = $test_curl;
+			}
+
 			if ( '[[' !== substr( $curl, 0, 2 ) && ']]' !== substr( $curl, -2 ) ) {
 				// Looks like a normal shortcode.
 				_wptexturize_pushpop_element( $curl, $no_texturize_shortcodes_stack, $no_texturize_shortcodes );
