PHP / MySQL的编码问题。 A替代某些字符(PHP/MySQL encoding pro

2019-07-01 10:36发布

使用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

Answer 1:

正如其他人所说,你需要转换为UTF-8从端到端的,如果你想支持“特”字。 这意味着你的网页,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,你想你的表转换为UTF-8,无需导出/导入。

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8

你可以,而且应该,配置MySQL为默认UTF8。 但你也可以运行查询:

 SET NAMES UTF8

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

这应该解决您所有的字符显示问题。



Answer 2:

这个问题的最有可能的原因是数据库连接设置为latin1但你喂养它在文本UTF-8编码。 要解决这个最简单的方法是将您的输入转换成客户所期待的:

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

(什么MySQL调用latin1是Windows 1252在世界其他地区。)请注意,许多字符,如报价破折号U + 2015年您使用那里,不能在此编码表示的,将被转换成别的东西。 理想情况下,你应该列编码改为utf8

另一种解决方案:设置数据库连接utf8 。 没关系的列是如何编码:MySQL的内部从连接编码到存储编码转换的文字,你可以保持的列latin1 ,如果你想。 (如果你这样做,报价破折号U + 2015年将变成一个问号?因为它不是在latin1

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

如果你这样做,你就必须设置页面编码为UTF-8与Content-Type头。 否则,你将有同样的问题与浏览器:喂养它在UTF-8时,它的期待别的文字编码:

header("Content-Type: text/html; charset=utf-8");


Answer 3:

如果从头开始提供的解决方案是有帮助的。 把所有可能的连接为UTF-8的确是最安全的。 UTF-8是在网络上的各种原因中最常用的字符集。

一些建议和提醒一句:

  • 复制你想要一个独特的前缀来消毒表(tmp_)
  • 虽然你的数据库连接被强制为utf8,请检查常规设置整理,改为utf8_bin如果还没有完成
  • 你需要在本地服务器上运行此
  • 有趣的炭误差主要是由于使用UTF-8配置混合LATIN1。 该解决方案是专为这一点。 这可能与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;
}

现在建立你所需要的程序:(表 - >)rows->字段,在每个字段调用

$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");


Answer 4:

改变MySQL的排序规则utf8_unicode_ci或utf8_general_ci,包括表和数据库。



Answer 5:

您将需要设置你的数据库是UTF-8是的。 有很多方法可以做到这一点。 由鲍勃迪伦的配置文件,通过phpMyAdmin的或致电其之前插入PHP函数(对不起记忆空白),并更新了MySQL。

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

有一件事你还需要知道,从经验的personnal,确保所有表的关系具有相同的排序规则,否则您将无法加入他们的行列。

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

而且,我可以是一个Apache的设置。 我们已经经历了“免费托管”服务器上,以及我哥哥的服务器上的同样的问题。 一旦切换到另一台服务器,所有的系统字符的变得整齐。 请验证是否你的Apache设置,抱歉,我不能在Apache的配置bting更多的光。



Answer 6:

摆脱一切,你只需要遵循这两点,对于特殊语言的字符每一个问题将得到解决。

1,您需要定义表的排序规则是utf8_general_ci。

2-定义<meta http-equiv="content-type" content="text/html; charset=utf-8">在头标记后的HTML。

2 -你需要定义mysql_set_charset('utf8',$link_identifier); 在这里你做出像“mysql_select_db”数据库的选择后与数据库和正确的连接在文件中使用“mysql_set_charset”这将允许您添加和检索数据在正确的什么都它是语言。



文章来源: PHP/MySQL encoding problems. â�� instead of certain characters