diff --git a/src/exercise.rs b/src/exercise.rs
index 18e8d5ab..3d2e38d1 100644
--- a/src/exercise.rs
+++ b/src/exercise.rs
@@ -1,3 +1,4 @@
+use std::env;
 use regex::Regex;
 use serde::Deserialize;
 use std::fmt::{self, Display, Formatter};
@@ -126,8 +127,13 @@ name = "{}"
 path = "{}.rs""#,
                     self.name, self.name, self.name
                 );
+                let cargo_toml_error_msg = if env::var("NO_EMOJI").is_ok() {
+                    "Failed to write Clippy Cargo.toml file."
+                } else {
+                    "Failed to write 📎 Clippy 📎 Cargo.toml file."
+                };
                 fs::write(CLIPPY_CARGO_TOML_PATH, cargo_toml)
-                    .expect("Failed to write 📎 Clippy 📎 Cargo.toml file.");
+                    .expect(cargo_toml_error_msg);
                 // To support the ability to run the clipy exercises, build
                 // an executable, in addition to running clippy. With a
                 // compilation failure, this would silently fail. But we expect
diff --git a/src/ui.rs b/src/ui.rs
index 38cbaa40..cb073372 100644
--- a/src/ui.rs
+++ b/src/ui.rs
@@ -1,23 +1,41 @@
 macro_rules! warn {
     ($fmt:literal, $ex:expr) => {{
+        use std::env;
         use console::{style, Emoji};
         let formatstr = format!($fmt, $ex);
-        println!(
-            "{} {}",
-            style(Emoji("⚠️ ", "!")).red(),
-            style(formatstr).red()
-        );
+        if env::var("NO_EMOJI").is_ok() {
+            println!(
+                "{} {}",
+                style("!").red(),
+                style(formatstr).red()
+            );
+        } else {
+            println!(
+                "{} {}",
+                style(Emoji("⚠️ ", "!")).red(),
+                style(formatstr).red()
+            );
+        }
     }};
 }
 
 macro_rules! success {
     ($fmt:literal, $ex:expr) => {{
+        use std::env;
         use console::{style, Emoji};
         let formatstr = format!($fmt, $ex);
-        println!(
-            "{} {}",
-            style(Emoji("✅", "✓")).green(),
-            style(formatstr).green()
-        );
+        if env::var("NO_EMOJI").is_ok() {
+            println!(
+                "{} {}",
+                style("✓").green(),
+                style(formatstr).green()
+            );
+        } else {
+            println!(
+                "{} {}",
+                style(Emoji("✅", "✓")).green(),
+                style(formatstr).green()
+            );
+        }
     }};
 }
diff --git a/src/verify.rs b/src/verify.rs
index 00e45c8c..7a0e9ccd 100644
--- a/src/verify.rs
+++ b/src/verify.rs
@@ -1,3 +1,4 @@
+use std::env;
 use crate::exercise::{CompiledExercise, Exercise, Mode, State};
 use console::style;
 use indicatif::ProgressBar;
@@ -137,14 +138,26 @@ fn prompt_for_completion(exercise: &Exercise, prompt_output: Option<String>) ->
         State::Pending(context) => context,
     };
 
+    let no_emoji = env::var("NO_EMOJI").is_ok();
+
+    let clippy_success_msg = if no_emoji {
+        "The code is compiling, and Clippy is happy!"
+    } else {
+        "The code is compiling, and 📎 Clippy 📎 is happy!"
+    };
+
     let success_msg = match exercise.mode {
         Mode::Compile => "The code is compiling!",
         Mode::Test => "The code is compiling, and the tests pass!",
-        Mode::Clippy => "The code is compiling, and 📎 Clippy 📎 is happy!",
+        Mode::Clippy => clippy_success_msg,
     };
 
     println!();
-    println!("🎉 🎉  {} 🎉 🎉", success_msg);
+    if no_emoji {
+        println!("~*~ {} ~*~", success_msg)
+    } else {
+        println!("🎉 🎉  {} 🎉 🎉", success_msg)
+    }
     println!();
 
     if let Some(output) = prompt_output {