Unable to update head_title string in template_preprocess_html
If you find that $head_title is different from implode(' | ', $head_title_array), it means there is a module running after yours that implements hook_preprocess_html() which runs after your implementation, or hook_process_html().

The code executed from Drupal is the following:


template_preprocess_html() (It runs before hook_preprocess_html().)

// Construct page title.
if (drupal_get_title()) {
  $head_title = array(
    'title' =&gt; strip_tags(drupal_get_title()), 
    'name' =&gt; check_plain(variable_get('site_name', 'Drupal')),
  );
}
else {
  $head_title = array('name' =&gt; check_plain(variable_get('site_name', 'Drupal')));
  if (variable_get('site_slogan', '')) {
    $head_title['slogan'] = filter_xss_admin(variable_get('site_slogan', ''));
  }
}
$variables['head_title_array'] = $head_title;
$variables['head_title'] = implode(' | ', $head_title);

// Populate the page template suggestions.
if ($suggestions = theme_get_suggestions(arg(), 'html')) {
  $variables['theme_hook_suggestions'] = $suggestions;
}

template_process_html() (It runs after hook_preprocess_html(), but before hook_process_html().)

There is no code that alters $variables['head_title_array'], or $variables['head_title'].


The fact $head_title_array contains the value you expect makes me think there is really a module that implements hook_preprocess_html to alter $variables['head_title'].

To be sure your module is the last one running hook_preprocess_html(), you need to make your module weight higher.