好的,我已经搜索了几个小时!得到答案。我发现的一切都没有做我想做的事。
我们的客户喜欢将HTML网站的部分内容复制到TinyMCE所见即所得编辑器中,然后复制到纯文本文本区域或输入字段(用于标题)。问题是所见即所得字符是HTML而不是RAW html。
这只是一个例子。请记住,我希望容纳可能引发此错误的任何可能的字符。
伴侣双按摩 - 浴缸双座步行
中间的DASH具有–
直接复制HTML并将其粘贴到纯文本输入字段或textarea会引发错误
编码“UTF8”的无效字节序列:0x96
尝试提交到UTF8数据库时。
客户有可能复制商标,版权或保留符号。
我不想把它们剥掉。我想转发它们。
我尝试过各种转换器。我不想列出我去过的每个网站。
有什么想法吗?
更糟糕的是,我只接受这4个字符并将其转换为任何字符。
答案 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="✓">
。
如果上述建议不起作用,请告诉我们您使用的浏览器,编程语言,网络框架和数据库,并尝试提供演示此问题的short, self-contained piece of sample code。