How does decode_entities() work? Let's say $node-&gt;field_description[LANGUAGE_NONE][0]['value'] contains 'We&amp;#039;re in this together'.
This code doesn't output what I expect.
$node = menu_get_object();
if (isset($node-&gt;field_description[LANGUAGE_NONE][0]['value'])) {
  $text = strip_tags($node-&gt;field_description[LANGUAGE_NONE][0]['value']);
  $text = decode_entities($text);
}

instead of 'We're in this together', I get 'We&amp;#039;re in this together'.
The full hook implementation is the following.
function MY_MODULE_page_alter($page) {
  // Provide list description.
  $node = menu_get_object();
  if (isset($node-&gt;field_description[LANGUAGE_NONE][0]['value'])) {
    $text = strip_tags($node-&gt;field_description[LANGUAGE_NONE][0]['value']);
    $text = decode_entities($text);
  }

  // Add metadata to describe site's content.
  $description = array(
    '#type' =&gt; 'html_tag',
    '#tag' =&gt; 'meta',
    '#attributes' =&gt; array(
      'name' =&gt; 'description',
      'content' =&gt; $text,
    ),
  );
  drupal_add_html_head($description, 'desciption');
}
The function decode_entities works as you expect.  It converts the HTML entity (&amp;#039;) into a single quote and returns the decoded string.

However, that single quote will be expanded into an entity again at some point downstream, when the page is rendered.  This is what inserts (provided you spell "description" correct) the following into your page's &lt;head&gt;:

&lt;meta name="description" content="We&amp;#039;re in this together" /&gt;


I would not worry about this.  The above is a perfectly valid HTML meta-tag and will be interpreted correctly for SEO purposes, etc.