2

使用 php 将某些字符输入到我的 mysql 数据库时,我遇到了一些问题。我正在做的是将用户输入的文本提交到数据库。我无法弄清楚我需要更改什么以允许将任何类型的字符放入数据库并通过 php 打印出来,因为它是假设的。

我的 MySQL 排序规则是:latin1_swedish_ci

就在我将文本从表单发送到数据库之前,我在数据上使用了 mysql_real_escape_string()。

下面的例子

本文:

�People are just as happy as they make up their minds to be.�
� Abraham Lincoln 

假设看起来像这样:

“People are just as happy as they make up their minds to be.”
― Abraham Lincoln
4

7 回答 7

7

正如其他人所提到的,如果要支持“特殊”字符,则需要从头到尾转换为 UTF8。这意味着您的网页、PHP、mysql 连接和 mysql 表。网页相当简单,只需使用 UTF8 的元标记。理想情况下,您的标题也会说 UTF8。

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

将您的 PHP 设置为使用 UTF8。无论如何,事情可能会奏效,但这样做是一个很好的措施:

mb_internal_encoding('UTF-8');
mb_http_output('UTF-8');
mb_http_input('UTF-8');

对于 mysql,您要将表转换为 UTF8,无需导出/导入。

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8

您可以并且应该将 mysql 配置为默认的 utf8。但您也可以运行查询:

 SET NAMES UTF8

作为建立连接后的第一个查询,这会将您的数据库连接“转换”为 UTF8。

这应该可以解决你所有的字符显示问题。

于 2012-10-20T04:03:37.673 回答
3

问题的最可能原因是数据库连接设置为,latin1但您正在输入以 UTF-8 编码的文本。解决这个问题的最简单方法是将您的输入转换为客户的期望:

$quote = iconv("UTF-8", "WINDOWS-1252//TRANSLIT", $quote);

(MySQLlatin1在世界其他地方调用的是 windows-1252。)请注意,许多字符,例如您在此处使用的引号 U+2015,无法以这种编码表示,并且将被转换为其他字符。理想情况下,您应该将列编码更改为utf8.

另一种解决方案:将数据库连接设置为utf8. 列的编码方式无关紧要:MySQL 在内部将文本从连接编码转换为存储编码,您可以根据需要保留列latin1。(如果这样做,引号 U+2015 将变成问号?,因为它不在 中latin1

如何设置连接编码取决于您使用的库:如果您使用已弃用的 MySQL 库,它是 mysql_set_charset,如果是 MySQLi,它是 mysqli_set_charset,如果 PDO 添加encoding=utf8到 DSN。

如果您这样做,您将使用 Content-Type 标头将页面编码设置为 UTF-8。否则你会在浏览器上遇到同样的问题:当它期待其他东西时,给它输入 UTF-8 编码的文本:

header("Content-Type: text/html; charset=utf-8");
于 2012-10-20T14:41:40.960 回答
1

如果从头开始,所提供的解决方案会很有帮助。将所有可能的连接都放到 UTF-8 确实是最安全的。由于各种原因,UTF-8 是网络上最常用的字符集。

一些建议和警告:

  • 使用唯一前缀 (tmp_)复制要清理的表
  • 尽管您的 db-connection 被强制为 utf8,但请检查您的 General Settings 排序规则,如果尚未完成,请更改为utf8_bin
  • 你需要在本地服务器上运行它
  • 有趣的字符错误主要是由于混合了 LATIN1 和 UTF-8 配置。该解决方案就是为此而设计的。它可以与 LATIN1 的其他使用过的字符集一起使用,但我没有检查过这个
  • 在复制回原始文件之前广泛检查这些 tmp_tables

构建魔术所需的 2 数组:

$chars = get_html_translation_table(HTML_ENTITIES, ENT_QUOTES, "UTF-8");
$LATIN1 = $UTF8 = array();
while (list($key,$val) = each ($chars)) {
    $UTF8[] = $key;
    $LATIN1[] = $val;
}

现在建立你需要的例程:(tables->)rows->fields 和在每个字段调用

$row[$field] = mysql_real_escape_string(str_replace($LATIN1 , $UTF8 , $row[$field]));
$q[] = "$field = '{$row[$field]}'";

最后建立并发送查询:

mysql_query("UPDATE $table SET " . implode(" , " , $q) . " WHERE id = '{$row['id']}' LIMIT 1");
于 2013-07-20T15:00:15.423 回答
0

将 MySQL 排序规则更改为 utf8_unicode_ci 或 utf8_general_ci,包括表和数据库。

于 2012-10-20T02:58:23.540 回答
0

摆脱一切你只需要遵循这两点,所有关于特殊语言字符的问题都会得到解决。

1-您需要将表的排序规则定义为 utf8_general_ci。

2-<meta http-equiv="content-type" content="text/html; charset=utf-8">在 HTML 中定义在 head 标签之后。

2-您需要mysql_set_charset('utf8',$link_identifier);在与数据库建立连接的文件中定义,并在选择“mysql_select_db”等数据库后立即使用“mysql_set_charset”,这将允许您以任何语言正确添加和检索数据.

于 2014-09-09T12:45:11.910 回答
0

您需要将数据库设置为 utf-8 是的。有很多方法可以做到这一点。通过更改配置文件,通过 phpmyadmin 或在插入和更新 mysql 之前调用 php 函数(抱歉内存空白)。

不幸的是,我认为您将不得不重新输入您之前输入的任何数据。

根据个人经验,您还需要知道一件事,确保所有具有关系的表都具有相同的排序规则,否则您将无法加入它们。

作为参考:http ://dev.mysql.com/doc/refman/5.6/en/charset-syntax.html

另外,我可以是 apache 设置。我们在“免费托管”服务器和我兄弟的服务器上都遇到了同样的问题。一旦切换到另一台服务器,所有字符都变得整洁。验证你的 apache 设置,对不起,但我不能更清楚地了解 apache 的配置。

于 2012-10-20T03:20:09.967 回答
0

如果您的文本已使用错误的编码进行编码和解码,因此 mojibake 实际上被“固化”为 unicode 字符,那么到目前为止提到的解决方案将不起作用。我最终成功地使用了ftfyPython 包来自动检测/修复 mojibake:

>>> import ftfy
>>> print(ftfy.fix_encoding("(ง'⌣')ง&quot;))
(ง'⌣')ง

希望这对处于类似情况的人有所帮助。

于 2021-03-16T16:58:53.477 回答