diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php
index 5e1b8d1b8dd17d00cece3f958dbb022fb0ce075f..1c36184430338b7f5ff6d755d127aba2673392a0 100644
--- a/core/lib/Drupal/Core/Render/Renderer.php
+++ b/core/lib/Drupal/Core/Render/Renderer.php
@@ -380,7 +380,7 @@ protected function doRender(&$elements, $is_root_call = FALSE) {
     }
 
     // All render elements support #markup and #plain_text.
-    if (!empty($elements['#markup']) || !empty($elements['#plain_text'])) {
+    if (isset($elements['#markup']) || isset($elements['#plain_text'])) {
       $elements = $this->ensureMarkupIsSafe($elements);
     }
 
@@ -744,11 +744,7 @@ protected function xssFilterAdminIfUnsafe($string) {
    * @see \Drupal\Component\Utility\Xss::filterAdmin()
    */
   protected function ensureMarkupIsSafe(array $elements) {
-    if (empty($elements['#markup']) && empty($elements['#plain_text'])) {
-      return $elements;
-    }
-
-    if (!empty($elements['#plain_text'])) {
+    if (isset($elements['#plain_text'])) {
       $elements['#markup'] = Markup::create(Html::escape($elements['#plain_text']));
     }
     elseif (!($elements['#markup'] instanceof MarkupInterface)) {
diff --git a/core/tests/Drupal/Tests/Core/Render/RendererTest.php b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
index adfc890cb08a21e0e229c3c55c81fd99a5179730..54037c57e9c47e26e2c1d14845e9efc736b17de9 100644
--- a/core/tests/Drupal/Tests/Core/Render/RendererTest.php
+++ b/core/tests/Drupal/Tests/Core/Render/RendererTest.php
@@ -89,6 +89,26 @@ public function providerTestRenderBasic() {
       ['#markup' => 'foo'],
       'foo',
     ];
+    // Basic #markup based renderable array with value '0'.
+    $data[] = [
+      ['#markup' => '0'],
+      '0',
+    ];
+    // Basic #markup based renderable array with value 0.
+    $data[] = [
+      ['#markup' => 0],
+      '0',
+    ];
+    // Basic #markup based renderable array with value ''.
+    $data[] = [
+      ['#markup' => ''],
+      '',
+    ];
+    // Basic #markup based renderable array with value NULL.
+    $data[] = [
+      ['#markup' => NULL],
+      '',
+    ];
     // Basic #plain_text based renderable array.
     $data[] = [
       ['#plain_text' => 'foo'],
@@ -104,6 +124,26 @@ public function providerTestRenderBasic() {
       ['#plain_text' => Markup::create('<em>foo</em>')],
       '&lt;em&gt;foo&lt;/em&gt;',
     ];
+    // #plain_text based renderable array with value '0'.
+    $data[] = [
+      ['#plain_text' => '0'],
+      '0',
+    ];
+    // #plain_text based renderable array with value 0.
+    $data[] = [
+      ['#plain_text' => 0],
+      '0',
+    ];
+    // #plain_text based renderable array with value ''.
+    $data[] = [
+      ['#plain_text' => ''],
+      '',
+    ];
+    // #plain_text based renderable array with value NULL.
+    $data[] = [
+      ['#plain_text' => NULL],
+      '',
+    ];
     // Renderable child element.
     $data[] = [
       ['child' => ['#markup' => 'bar']],