diff --git a/core/modules/views/src/Plugin/views/field/EntityField.php b/core/modules/views/src/Plugin/views/field/EntityField.php
index fe2f28da80..b11adb20b2 100644
--- a/core/modules/views/src/Plugin/views/field/EntityField.php
+++ b/core/modules/views/src/Plugin/views/field/EntityField.php
@@ -3,6 +3,7 @@
 namespace Drupal\views\Plugin\views\field;
 
 use Drupal\Component\Plugin\DependentPluginInterface;
+use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\Xss;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheableDependencyInterface;
@@ -957,7 +958,7 @@ protected function addSelfTokens(&$tokens, $item) {
 
         if (is_array($raw)) {
           if (isset($raw[$id]) && is_scalar($raw[$id])) {
-            $tokens['{{ ' . $this->options['id'] . '__' . $id . ' }}'] = Xss::filterAdmin($raw[$id]);
+            $tokens['{{ ' . $this->options['id'] . '__' . $id . ' }}'] = Html::decodeEntities(Xss::filterAdmin($raw[$id]));
           }
           else {
             // Make sure that empty values are replaced as well.
@@ -970,7 +971,7 @@ protected function addSelfTokens(&$tokens, $item) {
           // Check if TypedDataInterface is implemented so we know how to render
           // the item as a string.
           if (!empty($property) && $property instanceof TypedDataInterface) {
-            $tokens['{{ ' . $this->options['id'] . '__' . $id . ' }}'] = Xss::filterAdmin($property->getString());
+            $tokens['{{ ' . $this->options['id'] . '__' . $id . ' }}'] = Html::decodeEntities(Xss::filterAdmin($property->getString()));
           }
           else {
             // Make sure that empty values are replaced as well.
diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_token.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_token.yml
new file mode 100644
index 0000000000..c89e26f435
--- /dev/null
+++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_field_token.yml
@@ -0,0 +1,33 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - node
+id: test_field_token
+label: ''
+module: views
+description: ''
+tag: ''
+base_table: node_field_data
+base_field: nid
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: 0
+    display_options:
+      pager:
+        type: none
+        options:
+          offset: 0
+      row:
+        type: fields
+      fields:
+        title:
+          id: title
+          table: node_field_data
+          field: title
+          entity_type: node
+          entity_field: title
+          plugin_id: field
diff --git a/core/modules/views/tests/src/Kernel/Handler/FieldTokenEscapeTest.php b/core/modules/views/tests/src/Kernel/Handler/FieldTokenEscapeTest.php
new file mode 100644
index 0000000000..cff1fb1ea7
--- /dev/null
+++ b/core/modules/views/tests/src/Kernel/Handler/FieldTokenEscapeTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Drupal\Tests\views\Kernel\Handler;
+
+use Drupal\node\Entity\Node;
+use Drupal\node\Entity\NodeType;
+use Drupal\Core\Render\RenderContext;
+use Drupal\Tests\views\Kernel\ViewsKernelTestBase;
+use Drupal\views\Views;
+
+/**
+ * Tests Drupal\views\Plugin\views\field\EntityField handler token escaping.
+ *
+ * @group views
+ */
+class FieldTokenEscapeTest extends ViewsKernelTestBase {
+  // cspell:ignore Tegan
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  protected static $modules = ['node', 'user'];
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = ['test_field_token'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp($import_test_views = TRUE): void {
+    parent::setUp();
+
+    $this->installEntitySchema('user');
+    $this->installEntitySchema('node');
+
+    NodeType::create(['type' => 'article', 'label' => 'Article'])->save();
+
+    Node::create([
+      'title' => 'Tegan & Sara',
+      'type' => 'article',
+    ])->save();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function testTheTokens() {
+    /** @var \Drupal\Core\Render\RendererInterface $renderer */
+    $renderer = \Drupal::service('renderer');
+
+    $view = Views::getView('test_field_token');
+    $view->initHandlers();
+    $this->executeView($view);
+    $row = $view->result[0];
+    $title_field = $view->field['title'];
+    $title_field->options['alter']['text'] = '<p>{{ title__value }}</p>';
+    $title_field->options['alter']['alter_text'] = TRUE;
+    $output = $renderer->executeInRenderContext(new RenderContext(), function () use ($title_field, $row) {
+      return $title_field->theme($row);
+    });
+    $this->assertSame('<p>Tegan &amp; Sara</p>', (string) $output);
+  }
+
+}
