Index: /CKEditor/trunk/CHANGES.html
===================================================================
--- /CKEditor/trunk/CHANGES.html	(revision 4023)
+++ /CKEditor/trunk/CHANGES.html	(revision 4024)
@@ -220,4 +220,5 @@
 			(&quot;basic&quot;) loading model of the editor.</li>
 		<li><a href="http://dev.fckeditor.net/ticket/4139">#4139</a> : Fixed list plugin regression of [3903].</li>
+		<li><a href="http://dev.fckeditor.net/ticket/4147">#4147</a> : Unify style text normalization logic when comparing styles.</li>
 	</ul>
 	<h3>
Index: /CKEditor/trunk/_source/core/dom/element.js
===================================================================
--- /CKEditor/trunk/_source/core/dom/element.js	(revision 4023)
+++ /CKEditor/trunk/_source/core/dom/element.js	(revision 4024)
@@ -431,8 +431,5 @@
 						case 'style':
 							// IE does not return inline styles via getAttribute(). See #2947.
-							var styleText = this.$.style.cssText;
-							return styleText.toLowerCase().replace(
-								/\s*(?:;\s*|$)/, ';').replace(
-									/([^;])$/, '$1;');
+							return this.$.style.cssText;
 					}
 
Index: /CKEditor/trunk/_source/plugins/styles/plugin.js
===================================================================
--- /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 4023)
+++ /CKEditor/trunk/_source/plugins/styles/plugin.js	(revision 4024)
@@ -198,5 +198,9 @@
 						if ( attName == '_length' )
 							continue;
-						if ( attribs[attName] == element.getAttribute( attName ) )
+
+						var elementAttr = element.getAttribute( attName );
+						if ( attribs[attName] ==
+							 ( attName == 'style' ?
+							   normalizeCssText( elementAttr, false ) : elementAttr  ) )
 						{
 							if ( !fullMatch )
@@ -1179,13 +1183,26 @@
 	}
 
-	function normalizeCssText( unparsedCssText )
-	{
-		// Injects the style in a temporary span object, so the browser parses it,
-		// retrieving its final format.
-		var temp = new CKEDITOR.dom.element( 'span' );
-		temp.setAttribute( 'style', unparsedCssText );
-		var styleText = temp.getAttribute( 'style' );
-		// IE will leave a single semicolon when failed to parse the style text.(#3891)
-		return styleText == ';' ? '' : styleText;
+	function normalizeCssText( unparsedCssText, nativeNormalize )
+	{
+		var styleText;
+		if ( nativeNormalize != false )
+		{
+			// Injects the style in a temporary span object, so the browser parses it,
+			// retrieving its final format.
+			var temp = new CKEDITOR.dom.element( 'span' );
+			temp.setAttribute( 'style', unparsedCssText );
+			styleText = temp.getAttribute( 'style' );
+		}
+		else
+			styleText = unparsedCssText;
+
+		// Shrinking white-spaces around colon(#4147).
+		// Shrinking white-spaces around semi-colon.
+		// Compensate tail semi-colon.
+		return styleText.replace( /\s*:\s*/, ':' )
+							 .replace( /\s*(?:;\s*|$)/, ';' )
+							 .replace( /([^\s;])$/, '$1;')
+							 .toLowerCase();
+
 	}
 
