如何解决将PHP5升级为PHP7会导致SQL Server数据库中的编码问题
我们有一个PHP5.6网站项目,我们将在PHP7.4上重新启动它。
我们称它们为旧环境和新环境。旧的仍然完好无损。两者都在不同的服务器计算机上。
字符集(html元标记)设置为utf-8。
Zend Framework 1都参与其中。该数据库位于两个环境共享的SQL Server上。我们使用SqlSrv驱动程序连接到数据库(新环境),旧环境具有PDO-Sql。
数据库的编码设置为Latin1_General_CI_AS
。
信息正被插入到许多表中并从中选择(INSERT,SELECT)。 HTML文本字段和 textareas正在使用。
在旧环境中,用特殊字符(例如变音符)在文本字段/区域中写入的任何文本都以损坏的形式保存在数据库中,例如在数据库表中而不是ö。但是,在屏幕上的选择语句之后,它显示为ö(干净!)。
到现在为止还可以,但是现在我们有了新的环境。
假设在旧环境时代保存了一些旧条目,我们在新环境下打开网站。如数据库表中所示,内容显示为1:1,换句话说:已损坏。这就解释了为什么在新环境下保存的所有内容都能正确显示在屏幕上,因为无需更改数据库表即可保存特殊字符和变音符号。
但是在旧环境的网站上看不到使用新环境进行的输入。
使用utf8_encode
或utf8_decode
并没有多大帮助,要么看起来更糟,要么屏幕上没有文字也看不到。
编写一些脚本来更改表中的编码会引起混乱,因为既然仍在使用旧环境,就不可能那么容易做到。
选项中没有提到编码选项,该编码选项用于名为Zend_Db_Adapter_Sqlsrv
的类。
好吧,我不信任mb_detect_encoding
,但我们尝试了一下,但是它在表的返回值上返回了UTF-8。
那么人们会推荐什么?我可能会错过一些事实,但是如果需要,我会为您提供更多信息。
解决方法
这听起来与我过去解决的问题非常相似。不幸的是,我在ASP.NET中解决了它,所以我只能描述我所做的事情,然后让您将其转换为PHP。
所以可能是由于您的旧系统使用的是非UTF-8代码页而引起的,在我的情况下,该代码页是windows-1252
,这在当时非常普遍。代码页确定代码使用的字符编码。
因此,在更现代的系统上,我需要做的就是在我从数据库中读取代码时将代码页强制回到windows-1252
。然后在呈现页面之前,将内容编码设置为UTF-8。
因此,除非您能够从源头上解决问题,否则基本上您必须破解新系统才能继续以相同的方式运行-这是不幸的,但有时是必需的。
ASP.NET代码如下:
protected void Page_Load(object Sender,EventArgs Args)
{
// Set the encoding for building and rendering,then switch later to display as utf-8
Response.Charset = "windows-1252"; // Hmmm... double check this
Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1252");
}
protected void Render(HtmlTextWriter writer)
{
// Now that all the character encoding has taken place,switch to utf-8 to force it to display this way...
Response.Charset = "utf-8";
Response.ContentEncoding = Encoding.UTF8;
}
希望这给了您足够的机会……自从我这样做以来已经很长时间了,但是痛苦仍然在我的脑海中荡漾!
,由于这是其他人所做的项目,我们决定更新所有表并更正值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。