diff --git a/src/gn/command_format.cc b/src/gn/command_format.cc
index 15a0dc5..99e7a62 100644
--- a/src/gn/command_format.cc
+++ b/src/gn/command_format.cc
@@ -1084,22 +1084,6 @@
 
 }  // namespace
 
-bool FormatFileToString(Setup* setup,
-                        const SourceFile& file,
-                        TreeDumpMode dump_tree,
-                        std::string* output) {
-  Err err;
-  const ParseNode* parse_node =
-      setup->scheduler().input_file_manager()->SyncLoadFile(
-          LocationRange(), &setup->build_settings(), file, &err);
-  if (err.has_error()) {
-    err.PrintToStdout();
-    return false;
-  }
-  DoFormat(parse_node, dump_tree, output);
-  return true;
-}
-
 bool FormatStringToString(const std::string& input,
                           TreeDumpMode dump_tree,
                           std::string* output) {
@@ -1108,7 +1092,8 @@
   file.SetContents(input);
   Err err;
   // Tokenize.
-  std::vector<Token> tokens = Tokenizer::Tokenize(&file, &err);
+  std::vector<Token> tokens =
+      Tokenizer::Tokenize(&file, &err, WhitespaceTransform::kInvalidToSpace);
   if (err.has_error()) {
     err.PrintToStdout();
     return false;
@@ -1192,34 +1177,35 @@
       return 1;
     }
 
+    base::FilePath to_format = setup.build_settings().GetFullPath(file);
+    std::string original_contents;
+    if (!base::ReadFileToString(to_format, &original_contents)) {
+      Err(Location(),
+          std::string("Couldn't read \"") + FilePathToUTF8(to_format))
+          .PrintToStdout();
+      return 1;
+    }
+
     std::string output_string;
-    if (FormatFileToString(&setup, file, dump_tree, &output_string)) {
-      if (dump_tree == TreeDumpMode::kInactive) {
-        // Update the file in-place.
-        base::FilePath to_write = setup.build_settings().GetFullPath(file);
-        std::string original_contents;
-        if (!base::ReadFileToString(to_write, &original_contents)) {
-          Err(Location(), std::string("Couldn't read \"") +
-                              FilePathToUTF8(to_write) +
-                              std::string("\" for comparison."))
+    if (!FormatStringToString(original_contents, dump_tree, &output_string)) {
+      return 1;
+    }
+    if (dump_tree == TreeDumpMode::kInactive) {
+      // Update the file in-place.
+      if (dry_run)
+        return original_contents == output_string ? 0 : 2;
+      if (original_contents != output_string) {
+        if (base::WriteFile(to_format, output_string.data(),
+                            static_cast<int>(output_string.size())) == -1) {
+          Err(Location(),
+              std::string("Failed to write formatted output back to \"") +
+                  FilePathToUTF8(to_format) + std::string("\"."))
               .PrintToStdout();
           return 1;
         }
-        if (dry_run)
-          return original_contents == output_string ? 0 : 2;
-        if (original_contents != output_string) {
-          if (base::WriteFile(to_write, output_string.data(),
-                              static_cast<int>(output_string.size())) == -1) {
-            Err(Location(),
-                std::string("Failed to write formatted output back to \"") +
-                    FilePathToUTF8(to_write) + std::string("\"."))
-                .PrintToStdout();
-            return 1;
-          }
-          if (!quiet) {
-            printf("Wrote formatted to '%s'.\n",
-                   FilePathToUTF8(to_write).c_str());
-          }
+        if (!quiet) {
+          printf("Wrote formatted to '%s'.\n",
+                 FilePathToUTF8(to_format).c_str());
         }
       }
     }
diff --git a/src/gn/command_format_unittest.cc b/src/gn/command_format_unittest.cc
index 0420269..f334b70 100644
--- a/src/gn/command_format_unittest.cc
+++ b/src/gn/command_format_unittest.cc
@@ -17,24 +17,28 @@
 #define FORMAT_TEST(n)                                                      \
   TEST_F(FormatTest, n) {                                                   \
     ::Setup setup;                                                          \
+    std::string input;                                                      \
     std::string out;                                                        \
     std::string expected;                                                   \
     base::FilePath src_dir =                                                \
         GetExePath().DirName().Append(FILE_PATH_LITERAL(".."));             \
     base::SetCurrentDirectory(src_dir);                                     \
-    EXPECT_TRUE(commands::FormatFileToString(                               \
-        &setup, SourceFile("//src/gn/format_test_data/" #n ".gn"),          \
-        commands::TreeDumpMode::kInactive, &out));                          \
+    ASSERT_TRUE(base::ReadFileToString(                                     \
+        base::FilePath(FILE_PATH_LITERAL("src/gn/format_test_data/")        \
+                           FILE_PATH_LITERAL(#n) FILE_PATH_LITERAL(".gn")), \
+        &input));                                                           \
     ASSERT_TRUE(base::ReadFileToString(                                     \
         base::FilePath(FILE_PATH_LITERAL("src/gn/format_test_data/")        \
                            FILE_PATH_LITERAL(#n)                            \
                                FILE_PATH_LITERAL(".golden")),               \
         &expected));                                                        \
+    EXPECT_TRUE(commands::FormatStringToString(                             \
+        input, commands::TreeDumpMode::kInactive, &out));                   \
     EXPECT_EQ(expected, out);                                               \
     /* Make sure formatting the output doesn't cause further changes. */    \
     std::string out_again;                                                  \
-    EXPECT_TRUE(commands::FormatStringToString(out,                         \
-        commands::TreeDumpMode::kInactive, &out_again));                    \
+    EXPECT_TRUE(commands::FormatStringToString(                             \
+        out, commands::TreeDumpMode::kInactive, &out_again));               \
     ASSERT_EQ(out, out_again);                                              \
   }
 
@@ -116,3 +120,4 @@
 FORMAT_TEST(073)
 FORMAT_TEST(074)
 FORMAT_TEST(075)
+FORMAT_TEST(076)
diff --git a/src/gn/format_test_data/076.gn b/src/gn/format_test_data/076.gn
new file mode 100644
index 0000000..ea617dc
--- /dev/null
+++ b/src/gn/format_test_data/076.gn
@@ -0,0 +1,12 @@
+# Intentionally contains tabs which the formatter should convert to spaces, but
+# only where it's not relevant to the parse.
+
+if (true) {
+	sources = [
+	  "a.c", "a.h", "main.c"
+	]
+}
+
+if (false) {
+  embedded = "a tab	to leave	alone"
+}
diff --git a/src/gn/format_test_data/076.golden b/src/gn/format_test_data/076.golden
new file mode 100644
index 0000000..b682482b
--- /dev/null
+++ b/src/gn/format_test_data/076.golden
@@ -0,0 +1,14 @@
+# Intentionally contains tabs which the formatter should convert to spaces, but
+# only where it's not relevant to the parse.
+
+if (true) {
+  sources = [
+    "a.c",
+    "a.h",
+    "main.c",
+  ]
+}
+
+if (false) {
+  embedded = "a tab	to leave	alone"
+}
diff --git a/src/gn/tokenizer.cc b/src/gn/tokenizer.cc
index 67c21d5..eec2349 100644
--- a/src/gn/tokenizer.cc
+++ b/src/gn/tokenizer.cc
@@ -68,14 +68,22 @@
 
 }  // namespace
 
-Tokenizer::Tokenizer(const InputFile* input_file, Err* err)
-    : input_file_(input_file), input_(input_file->contents()), err_(err) {}
+Tokenizer::Tokenizer(const InputFile* input_file,
+                     Err* err,
+                     WhitespaceTransform whitespace_transform)
+    : input_file_(input_file),
+      input_(input_file->contents()),
+      err_(err),
+      whitespace_transform_(whitespace_transform) {}
 
 Tokenizer::~Tokenizer() = default;
 
 // static
-std::vector<Token> Tokenizer::Tokenize(const InputFile* input_file, Err* err) {
-  Tokenizer t(input_file, err);
+std::vector<Token> Tokenizer::Tokenize(
+    const InputFile* input_file,
+    Err* err,
+    WhitespaceTransform whitespace_transform) {
+  Tokenizer t(input_file, err, whitespace_transform);
   return t.Run();
 }
 
@@ -339,7 +347,9 @@
   DCHECK(!at_end());
   char c = input_[cur_];
   // Note that tab (0x09), vertical tab (0x0B), and formfeed (0x0C) are illegal.
-  return c == 0x0A || c == 0x0D || c == 0x20;
+  return c == 0x0A || c == 0x0D || c == 0x20 ||
+         (whitespace_transform_ == WhitespaceTransform::kInvalidToSpace &&
+          (c == 0x09 || c == 0x0B || c == 0x0C));
 }
 
 bool Tokenizer::IsCurrentStringTerminator(char quote_char) const {
diff --git a/src/gn/tokenizer.h b/src/gn/tokenizer.h
index a2153ca..fb74d2a 100644
--- a/src/gn/tokenizer.h
+++ b/src/gn/tokenizer.h
@@ -16,9 +16,22 @@
 
 class InputFile;
 
+// Tab (0x09), vertical tab (0x0B), and formfeed (0x0C) are illegal in GN files.
+// Almost always these are errors. However, in the case of running the formatter
+// it's nice to convert these to spaces when encountered so that the input can
+// still be parsed and rewritten correctly by the formatter.
+enum class WhitespaceTransform {
+  kMaintainOriginalInput,
+  kInvalidToSpace,
+};
+
 class Tokenizer {
  public:
-  static std::vector<Token> Tokenize(const InputFile* input_file, Err* err);
+  static std::vector<Token> Tokenize(
+      const InputFile* input_file,
+      Err* err,
+      WhitespaceTransform whitespace_transform =
+          WhitespaceTransform::kMaintainOriginalInput);
 
   // Counts lines in the given buffer (the first line is "1") and returns
   // the byte offset of the beginning of that line, or (size_t)-1 if there
@@ -39,7 +52,9 @@
 
  private:
   // InputFile must outlive the tokenizer and all generated tokens.
-  Tokenizer(const InputFile* input_file, Err* err);
+  Tokenizer(const InputFile* input_file,
+            Err* err,
+            WhitespaceTransform whitespace_transform);
   ~Tokenizer();
 
   std::vector<Token> Run();
@@ -79,6 +94,7 @@
   const InputFile* input_file_;
   const std::string_view input_;
   Err* err_;
+  WhitespaceTransform whitespace_transform_;
   size_t cur_ = 0;  // Byte offset into input buffer.
 
   int line_number_ = 1;
diff --git a/src/gn/tokenizer_unittest.cc b/src/gn/tokenizer_unittest.cc
index b7423a8..d740d86 100644
--- a/src/gn/tokenizer_unittest.cc
+++ b/src/gn/tokenizer_unittest.cc
@@ -203,3 +203,35 @@
       "}",
       fn2));
 }
+
+TEST(Tokenizer, WhitespaceTransformMaintain) {
+  InputFile input(SourceFile("/test"));
+  input.SetContents("a\t2\v\"st\tuff\"\f{");
+
+  Err err;
+  std::vector<Token> results = Tokenizer::Tokenize(
+      &input, &err, WhitespaceTransform::kMaintainOriginalInput);
+  EXPECT_TRUE(err.has_error());
+  EXPECT_EQ(err.location().column_number(), 2);
+}
+
+TEST(Tokenizer, WhitespaceTransformToSpace) {
+  InputFile input(SourceFile("/test"));
+  input.SetContents("a\t2\v\"st\tuff\"\f{");
+
+  Err err;
+  std::vector<Token> results =
+      Tokenizer::Tokenize(&input, &err, WhitespaceTransform::kInvalidToSpace);
+  EXPECT_FALSE(err.has_error());
+  ASSERT_EQ(results.size(), 4u);
+  EXPECT_EQ(results[0].type(), Token::IDENTIFIER);
+  EXPECT_EQ(results[0].value(), "a");
+  EXPECT_EQ(results[1].type(), Token::INTEGER);
+  EXPECT_EQ(results[1].value(), "2");
+  EXPECT_EQ(results[2].type(), Token::STRING);
+  EXPECT_EQ(results[2].value(),
+            "\"st\tuff\"");  // Note, embedded \t not transformed.
+  EXPECT_EQ(results[3].type(), Token::LEFT_BRACE);
+  EXPECT_EQ(results[3].value(), "{");
+}
+
