diff --git a/core/misc/drupal.js b/core/misc/drupal.js
index 70ac77dd94e3bf405f0c611b2108050a5e74acb0..b1b4125d4b3db27acf2985ff74200c8bce9cd53f 100644
--- a/core/misc/drupal.js
+++ b/core/misc/drupal.js
@@ -214,26 +214,29 @@ if (window.jQuery) {
    * @ingroup sanitization
    */
   Drupal.formatString = function (str, args) {
+    // Keep args intact.
+    var processedArgs = {};
     // Transform arguments before inserting them.
     for (var key in args) {
       if (args.hasOwnProperty(key)) {
         switch (key.charAt(0)) {
           // Escaped only.
           case '@':
-            args[key] = Drupal.checkPlain(args[key]);
+            processedArgs[key] = Drupal.checkPlain(args[key]);
             break;
           // Pass-through.
           case '!':
+            processedArgs[key] = args[key];
             break;
           // Escaped and placeholder.
           default:
-            args[key] = Drupal.theme('placeholder', args[key]);
+            processedArgs[key] = Drupal.theme('placeholder', args[key]);
             break;
         }
       }
     }
 
-    return Drupal.stringReplace(str, args, null);
+    return Drupal.stringReplace(str, processedArgs, null);
   };
 
   /**