25

我有一个带有文本区域的表格。用户输入存储在数据库中的文本块。

有时,用户会从 Word 中粘贴包含智能引号或短划线的文本。这些字符在数据库中显示为: –, ’, “ ,â€</p>

我应该在输入字符串上调用什么函数来将智能引号转换为常规引号并将 emdashes 转换为常规破折号

我在 PHP 中工作。

更新:感谢迄今为止所有出色的回应。Joel 网站上关于编码的页面信息量很大: http: //www.joelonsoftware.com/articles/Unicode.html

关于我的环境的一些注意事项:

MySQL 数据库使用 UTF-8 编码。同样,显示内容的 HTML 页面通过显式设置元内容类型使用 UTF-8(更新:)。

在这些页面上,智能引号和破折号显示为带有问号的菱形。

解决方案:

再次感谢您的回复。解决方案是双重的:

  1. 确保数据库和 HTML 文件已明确设置为使用 UTF-8 编码。
  2. 使用htmlspecialchars()而不是 htmlentities().
4

13 回答 13

15

这听起来像是一个 Unicode 问题。Joel Spolsky 在这个话题上有一个很好的起点:http: //www.joelonsoftware.com/articles/Unicode.html

于 2008-10-06T19:24:28.100 回答
9

mysql 数据库使用 UTF-8 编码。同样,显示内容的 html 页面使用 UTF-8。

HTML 的内容可以是 UTF-8,是的,但是您是否也将 HTML 页面(通过 PHP 生成?)的内容类型(编码)也显式设置为 UTF-8?尝试返回 HTML 的Content-Type标题"text/html;charset=utf-8"或添加<meta>标签:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>

这样,提交给 PHP 的数据的内容类型也将是相同的。

我有一个类似的问题,添加<meta>标签对我有用。

于 2008-10-07T16:02:19.397 回答
4

听起来真正的问题是您的数据库没有使用与您的页面相同的字符编码(可能应该是 UTF-8)。在这种情况下,如果任何用户提交非 ASCII 字符,您可能会在数据库中看到奇怪的字符。只查找和修复其中的几个(弯引号和短划线)并不能解决真正的问题。

以下是有关将数据库迁移到另一种字符编码的一些信息,至少对于 MySQL 数据库而言。

于 2008-10-06T19:30:16.810 回答
2

不幸的是,这是一个非常普遍的问题,PHP 对字符集的处理很差,这无济于事。

我们所做的是强制文本通过iconv

// Convert input data to UTF8, ignore any odd (MS Word..) chars
// that don't translate
$input = iconv("ISO-8859-1","UTF-8//IGNORE",$input);

//IGNORE标志意味着任何无法翻译的东西都将被丢弃。

如果附加字符串 //IGNORE,则无法在目标字符集中表示的字符将被静默丢弃。

于 2008-10-06T19:39:49.957 回答
1

我们经常会为此使用标准的字符串替换函数。尽管在这种情况下 ASCII/Unicode 的性质非常模糊,但它确实有效。只需确保您的 php 文件以正确的编码格式保存,等等。

于 2008-10-06T19:28:59.027 回答
1

根据我的经验,只接受智能引号并确保您在任何地方都使用相同的编码会更容易。首先,将其添加到您的表单标签中:accept-charset="utf-8"

于 2008-10-06T19:31:55.980 回答
1

您可以尝试将 mb_ convert_encoding从 ISO-8859-1 转换为 UTF-8。

$str = mb_convert_encoding($str, 'UTF-8', 'ISO-8859-1');

这假设您需要 UTF-8,并且 convert 可以找到合理的替换...如果没有,请自行使用 mb_str_replace 或 preg_replace。

于 2008-10-06T19:32:21.110 回答
1

这可能不是最好的解决方案,但我会尝试测试以找出 PHP 看到的内容。假设它看到“-”(还有一些其他的可能性,比如简单的““”或者可能是““”)。然后执行 str_replace 以摆脱所有这些并用普通引号替换它们,然后将答案填充到数据库中。

更好的解决方案可能涉及使端到端数据通过所有 UTF-8,因为人们正试图在其他答案中提供帮助。

于 2008-10-07T16:18:54.730 回答
1

您必须确保您的数据库连接配置为从客户端接受和提供 UTF-8(否则它将转换为“默认”,通常是 latin1)。

实际上,这意味着运行查询 SET NAMES 'utf8';

http://www.phpwact.org/php/i18n/utf-8/mysql

此外,智能引号是 windows-1252 字符集的一部分,而不是 iso-8859-1 (latin-1)。与您的问题不太相关,但仅供参考。欧元符号也在那里。

于 2008-10-07T17:18:05.483 回答
1

问题出在 mysql 字符集上,我用这行代码解决了我的问题。

mysql_set_charset('utf8',$link); 
于 2010-10-24T17:20:19.867 回答
1

您必须手动将各个列的排序规则更改为 UTF8;整体更改数据库不会改变这些。

于 2011-10-10T15:24:52.167 回答
1
于 2014-10-16T04:48:58.230 回答
1

实际上问题不是在 PHP 中发生,而是在 JavaScript 中发生,这是由于从 Word 复制/粘贴所致,因此在将文本传递给 PHP 之前,您需要在 JavaScript 中解决问题,请参阅此答案https:// stackoverflow.com/a/6219023/1857295

于 2016-02-11T08:47:26.180 回答