一个奇怪的字符编码案例,从PHP到MySQL再返回

一个奇怪的字符编码案例,从PHP到MySQL再返回,php,mysql,database,encoding,character,Php,Mysql,Database,Encoding,Character,我被一个问题难住了。看来我尝试过的大多数技巧根本不起作用。问题概述如下: 创建表格,排序规则设置为utf8\U unicode\U ci。列也一样 表单所在的页面的字符编码为UTF-8(在标记中)。表单设置为接受UTF-8的字符集() 使用htmlspecialchars(@trim($str),ENT_引号,“UTF-8”)执行.php sanitizies表单输入并运行mysql\u real\u escape\u string($str)。声明数据库连接应该用UTF-8编码(mysql\u

我被一个问题难住了。看来我尝试过的大多数技巧根本不起作用。问题概述如下:

  • 创建表格,排序规则设置为utf8\U unicode\U ci。列也一样

  • 表单所在的页面的字符编码为UTF-8(在
    标记中)。表单设置为接受UTF-8的字符集(

  • 使用
    htmlspecialchars(@trim($str),ENT_引号,“UTF-8”)执行.php sanitizies表单输入
    并运行
    mysql\u real\u escape\u string($str)。声明数据库连接应该用UTF-8编码(
    mysql\u set\u charset('UTF-8');
    )。将值插入数据库。如果我停止数据库插入并回显查询,就会得到正常的输出

  • 现在乐趣开始了。MySQL行显示奇数字符,例如ß变为ß

  • 如果我检索数据库数据并用UTF-8编码将其显示在页面上,字符看起来也很混乱(ß)。但是,当我将页面编码更改为Western ISO时,字符显示很好-ß

  • 我怀疑表单将数据提交到数据库时会出现问题。。。但我无法准确指出哪里出了问题。

    有几件事

  • 请勿通过
    htmlspecialchars
    或任何其他方式运行发布的数据。验证输入,但如果输入有效,则按原样存储
  • 如有必要,可使用
    htmlspecialchars
    对输出进行清理
  • 确保仅在UTF8字符串上使用二进制安全函数。不太可能在现代PHP中遇到这种情况,但这是可能的
  • 停止使用不推荐使用的mysql库,切换到mysqli(easy)或PDO
  • 使用mysqli初始化数据库连接后,设置名称utf8
  • 确保您的PHP文件(或任何使用过的)保存为UTF8
  • 将响应标题设置为UTF8:
    标题('Content-type:text/html;charset=utf-8')
    
  • 添加到
    页面
  • 几件事

  • 请勿通过
    htmlspecialchars
    或任何其他方式运行发布的数据。验证输入,但如果输入有效,则按原样存储
  • 如有必要,可使用
    htmlspecialchars
    对输出进行清理
  • 确保仅在UTF8字符串上使用二进制安全函数。不太可能在现代PHP中遇到这种情况,但这是可能的
  • 停止使用不推荐使用的mysql库,切换到mysqli(easy)或PDO
  • 使用mysqli初始化数据库连接后,设置名称utf8
  • 确保您的PHP文件(或任何使用过的)保存为UTF8
  • 将响应标题设置为UTF8:
    标题('Content-type:text/html;charset=utf-8')
    
  • 添加到
    页面

  • 您是否尝试不使用htmlspecialchars()?

    您是否尝试不使用htmlspecialchars()?

    您还需要将数据库表和列的字符集设置为UTF-8。排序规则只处理数据的排序/比较方式,而不处理数据的编码方式。

    您还需要将数据库表的字符集和列设置为UTF-8。排序规则只处理数据的排序/比较方式,而不处理数据的编码方式。

    1。我希望我可以,但我正在开发一个应用程序,它做了大量的工作。。。而且我不能像我想的那样轻松地切换到mysqli。2.我将避免使用
    htmlspecialchars
    。那条斜线呢?3.它不应该是
    设置名称utf8
    ?4.响应头应该在哪里?我已经在exec.php中放置了一个,不确定这是否是正确的位置。好的,结果是
    mysql\u query(SET NAMES utf8)
    工作得很好。有趣的是,
    mysql\u set\u charset('utf-8')
    不起作用:/Matt:)@teddyrised可以使用htmlspecialchars,但只用于HTML输出,不更改输入。切换到mysqli并不是一个交易破坏者。请参阅我的编辑以获得其余部分的答案。如果我使用新的HTML5字符集声明,即
    ,有什么区别吗?我现在正在调查mysqli。。。由于在后面狠狠地咬了我一口的字符集现在不见了:)没有区别,请使用适合您内容的元标记。
    header()
    调用plus
    应该确保没有浏览器将页面解释为utf8.1以外的任何内容。我希望我可以,但我正在开发一个应用程序,它做了大量的工作。。。而且我不能像我想的那样轻松地切换到mysqli。2.我将避免使用
    htmlspecialchars
    。那条斜线呢?3.它不应该是
    设置名称utf8
    ?4.响应头应该在哪里?我已经在exec.php中放置了一个,不确定这是否是正确的位置。好的,结果是
    mysql\u query(SET NAMES utf8)
    工作得很好。有趣的是,
    mysql\u set\u charset('utf-8')
    不起作用:/Matt:)@teddyrised可以使用htmlspecialchars,但只用于HTML输出,不更改输入。切换到mysqli并不是一个交易破坏者。请参阅我的编辑以获得其余部分的答案。如果我使用新的HTML5字符集声明,即
    ,有什么区别吗?我现在正在调查mysqli。。。由于在后面狠狠地咬了我一口的字符集现在不见了:)没有区别,请使用适合您内容的元标记。
    header()
    调用plus
    应该确保没有浏览器将页面解释为utf8以外的任何内容。