剥离HTML字符并转换为纯文本

时间:2012-11-26 22:33:03

标签: html utf-8

好的,我已经搜索了几个小时!得到答案。我发现的一切都没有做我想做的事。

我们的客户喜欢将HTML网站的部分内容复制到TinyMCE所见即所得编辑器中,然后复制到纯文本文本区域或输入字段(用于标题)。问题是所见即所得字符是HTML而不是RAW html。

这只是一个例子。请记住,我希望容纳可能引发此错误的任何可能的字符。

伴侣双按摩 - 浴缸双座步行

中间的DASH具有–

的html实体

直接复制HTML并将其粘贴到纯文本输入字段或textarea会引发错误

  

编码“UTF8”的无效字节序列:0x96

尝试提交到UTF8数据库时。

客户有可能复制商标,版权或保留符号。

我不想把它们剥掉。我想转发它们。

我尝试过各种转换器。我不想列出我去过的每个网站。

有什么想法吗?

更糟糕的是,我只接受这4个字符并将其转换为任何字符。

2 个答案:

答案 0 :(得分:0)

试试这个。将“旧”数据转换为Utf-8需要付出一些努力。 “旧”是指来自旧数据库的数据,可以是UTF-8或拉丁文,也可以是转义字符或非转义字符。结果始终是包含原始字符(而不是实体)的Utf-8字符串。

/**
 * Decodes HTML entities and converts the string to UTF-8 if it isn't UTF-8 already.
 * @param string $string LATIN-1 or UTF-8 string that may contain html_encoded characters.
 * @returns string
*/
private function tidyUtf8($string)
{
  // Check if the string contains any Latin characters that are not valid UTF-8.
  $utfCheckString = @iconv(
       'UTF-8',
       'UTF-8//IGNORE',
       $string
  );
  $isUtf = ($string === $utfCheckString);

  // If the string is not UTF-8, convert it to UTF-8
  if ($isUtf === false)
  {
       // Decode HTML entities to prevent double encoding later. 
       // Decode only the ones that are valid LATIN-1 characters.
       $string = html_entity_decode($string, ENT_QUOTES, 'ISO-8859-1');
       $string = iconv('ISO-8859-1', 'UTF-8', $string);
  }

  // Decode all HTML entities to prevent double encoding later. 
  // Include UTF-8 characters.
  $string = html_entity_decode($string, ENT_QUOTES, 'UTF-8');

  return $string;
}

此功能旨在接受UTF-8和LATIN-1(ISO-8859-1)。您可能不需要后者,因此您可以剥离此功能的一部分并使用:

html_entity_decode($string, ENT_QUOTES, 'UTF-8');

答案 1 :(得分:0)

这是一个编码问题,而不是HTML实体的问题。当您将HTML中的数据复制到文本框中时,浏览器不会粘贴在–之类的实体中,而是粘贴在实际角色中。看起来你得到的角色是在Windows-1252中编码的(有时被错误地称为ISO-8859-1)。由于数据库需要UTF-8,因此无法处理此字符。

可能会发生一些可能的原因。您没有列出您正在使用的浏览器,语言,Web框架或数据库,因此我将提供一些建议,并希望其中一个有效。通常,最好在每个阶段使用UTF-8进行编码;但如果不可能,您需要在所有级别中使用一致的编码,或者您需要转换。

由于您的数据库使用UTF-8,我将假设您要使用的编码。要检查的一件事是您的网页是否作为UTF-8提供。检查HTTP响应的标头;应该有一个Content-Type: text/html; charset=utf-8标题。如果错误,遗漏或遗漏了charset=utf-8部分,则浏览器可能会选择错误的字符集。还有一件好事是在<meta charset=utf-8>中添加<head>标记;如果您将字符集作为HTTP标头的一部分发送,则不需要这样做,如果标头不存在,或者文档是从file: URL等加载的,它可以帮助选择正确的字符集,没有标题可用。

虽然浏览器在提交表单时应使用文档的字符集,但您可以使用表单accept-charset上的<form accept-charset=utf-8>属性确保使用正确的字符集提交。这将确保即使页面在标题中设置了无字符集,表单也会以UTF-8的形式提交数据。

最后,即使所有这些都是正确的,如果用户更改了编码设置,IE 5到8有时会以不同于页面发送的编码提交数据。要强制它发送UTF-8数据,您可以使用隐藏的表单属性,该属性包含无法在Windows-1252等传统编码中编码的字符。 Ruby on Rails的某些版本为此目的使用了snowman(☃),但后来更改为复选标记(✓)以减少puzzling。您可以向表单添加类似的元素以强制IE使用UTF-8:<input name="_utf7" type="hidden" value="&#x2713;">

如果上述建议不起作用,请告诉我们您使用的浏览器,编程语言,网络框架和数据库,并尝试提供演示此问题的short, self-contained piece of sample code