diff --git a/extension/background.js b/extension/background.js
index f392107..859cd16 100644
--- a/extension/background.js
+++ b/extension/background.js
@@ -584,7 +584,13 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
                   }
               } else { // No error from content.js, proceed to send data
                   try {
-                      const responseText = message.text || "";
+                      let responseText = message.text || "";
+                      
+                      // Decode text if it was encoded by content script
+                      if (message.encoded) {
+                          responseText = decodeURIComponent(responseText);
+                      }
+                      
                       console.log(BG_LOG_PREFIX, `Attempting to send FINAL CHAT_RESPONSE_CHUNK for requestId ${message.requestId}. Data length: ${responseText.length}`);
                       relaySocket.send(JSON.stringify({
                           type: "CHAT_RESPONSE_CHUNK",
@@ -996,7 +1002,7 @@ chrome.debugger.onEvent.addListener((debuggeeId, message, params) => {
                     }
                     console.log(BG_LOG_PREFIX, `Raw responseBodyData for debugger requestId ${params.requestId} (first 200 chars):`, JSON.stringify(responseBodyData).substring(0, 200) + "...");
 
-                    const rawBodyText = responseBodyData.base64Encoded ? atob(responseBodyData.body) : responseBodyData.body;
+                    const rawBodyText = responseBodyData.base64Encoded ? new TextDecoder('utf-8').decode(Uint8Array.from(atob(responseBodyData.body), c => c.charCodeAt(0))) : responseBodyData.body;
                     
                     if (rawBodyText === undefined || rawBodyText === null) {
                         console.error(BG_LOG_PREFIX, `Extracted rawBodyText is undefined or null for debugger requestId ${params.requestId}.`);
diff --git a/extension/content.js b/extension/content.js
index 0a30933..0a40cab 100644
--- a/extension/content.js
+++ b/extension/content.js
@@ -812,22 +812,26 @@ function handleProviderResponse(requestId, responseText, isFinal) {
       const MAX_RESPONSE_TEXT_LENGTH = 500 * 1024; // 500KB limit for safety
       let messageToSendToBackground;
 
+      // Encode special Unicode characters before transmission
+      const encodedText = responseText ? encodeURIComponent(responseText) : "";
+      
       if (responseText && typeof responseText === 'string' && responseText.length > MAX_RESPONSE_TEXT_LENGTH) {
           console.warn(CS_LOG_PREFIX, `ResponseText for requestId ${requestId} is too large (${responseText.length} bytes). Sending error and truncated text.`);
           messageToSendToBackground = {
               type: "FINAL_RESPONSE_TO_RELAY",
               requestId: requestId,
               error: `Response too large to transmit (length: ${responseText.length}). Check content script logs for truncated version.`,
-              // text: responseText.substring(0, MAX_RESPONSE_TEXT_LENGTH) + "... (truncated by content.js)", // Optionally send truncated
-              text: `Error: Response too large (length: ${responseText.length}). See AI Studio for full response.`, // Simpler error text
-              isFinal: true // This is a final error state
+              text: `Error: Response too large (length: ${responseText.length}). See AI Studio for full response.`,
+              isFinal: true,
+              encoded: true
           };
       } else {
           messageToSendToBackground = {
               type: "FINAL_RESPONSE_TO_RELAY",
               requestId: requestId,
-              text: responseText, // Can be null if AIStudioProvider parsed it as such
-              isFinal: isFinal
+              text: encodedText,
+              isFinal: isFinal,
+              encoded: true
           };
       }