diff --git a/src/emitterutils.cpp b/src/emitterutils.cpp index 34da1bc..4a4c982 100644 --- a/src/emitterutils.cpp +++ b/src/emitterutils.cpp @@ -375,14 +375,16 @@ bool WriteLiteralString(ostream_wrapper& out, const std::string& str, bool WriteChar(ostream_wrapper& out, char ch) { if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) { out << ch; - } else if ((0x20 <= ch && ch <= 0x7e) || ch == ' ') { - out << "\"" << ch << "\""; + } else if (ch == '\"') { + out << "\"\\\"\""; } else if (ch == '\t') { out << "\"\\t\""; } else if (ch == '\n') { out << "\"\\n\""; } else if (ch == '\b') { out << "\"\\b\""; + } else if ((0x20 <= ch && ch <= 0x7e) || ch == ' ') { + out << "\"" << ch << "\""; } else { out << "\""; WriteDoubleQuoteEscapeSequence(out, ch); diff --git a/test/integration/emitter_test.cpp b/test/integration/emitter_test.cpp index cb7156a..e65ed85 100644 --- a/test/integration/emitter_test.cpp +++ b/test/integration/emitter_test.cpp @@ -962,6 +962,14 @@ TEST_F(EmitterTest, QuoteNull) { ExpectEmit("\"null\""); } +TEST_F(EmitterTest, ValueOfDoubleQuote) { + out << YAML::BeginMap; + out << YAML::Key << "foo" << YAML::Value << '"'; + out << YAML::EndMap; + + ExpectEmit("foo: \"\\\"\""); +} + class EmitterErrorTest : public ::testing::Test { protected: void ExpectEmitError(const std::string& expectedError) {