PHP5 到 PHP7 升级导致 SQL 服务器数据库中的编码问题
PHP5 to PHP7 upgrade causes encoding troubles in SQL Server database
我们有一个 PHP5.6 网站项目,我们即将在 PHP7.4.
上重新启动它
姑且称之为旧环境和新环境吧。旧的还完好无损。两者都在不同的服务器机器上。
字符集(html 元标记)设置为 utf-8。
Zend Framework 1 涉及两者。数据库位于 SQL 服务器上,由两个环境共享。我们使用SqlSrv驱动连接数据库(新环境),旧环境有PDO-Sql.
数据库的编码设置为Latin1_General_CI_AS
。
正在插入信息,并且 select编辑了 into/from 很多 table(插入,SELECT)。 Html 文本框和
文本区域正在使用中。
在旧环境中,任何用 textfields/-areas 编写的带有特殊字符(例如变音符号)的文本都以损坏的形式保存在数据库中,例如数据库中没有 ö 而是 ö table。然而,在屏幕上,在 select 语句之后,它显示为 ö(干净!)。
之前一切正常,但现在我们有了新环境。
假设有旧环境时代保存的旧条目,我们在新环境打开网站。内容显示 1:1 与在数据库 table 中看到的一样,换句话说:已损坏。这解释了为什么在新环境的帮助下保存的任何内容都能在屏幕上正确显示,因为特殊字符和变音符号在数据库中没有任何更改的情况下保存 table。
但是在旧环境网站上看不到新环境下的条目
使用 utf8_encode
或 utf8_decode
并没有多大帮助,要么看起来更糟,要么屏幕上没有文字可以看到。
在 table 中编写一些更改编码的脚本会造成混乱,因为由于旧环境仍在使用,因此无法轻松完成。
选项中没有提到编码选项,这些选项在名为 Zend_Db_Adapter_Sqlsrv
的 class 上使用。
好吧,我不相信 mb_detect_encoding
但我们已经尝试过了,但是它在 tables 的返回值上返回了 UTF-8。
那么人们会推荐什么?我可能遗漏了一些事实,但如果需要,我会为您提供更多信息。
这听起来与我过去解决过的问题非常相似。不幸的是我在ASP.NET中解决了它,所以我只能描述我做了什么,让你把它翻译成PHP。
所以问题的出现可能是因为您的旧系统使用的是 non-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;
}
希望这能让你有足够的时间继续下去......我已经很久没有这样做了,但疼痛仍然在我脑海中挥之不去!
由于这是别人做的项目,我们决定更新所有表并更正值。
我们有一个 PHP5.6 网站项目,我们即将在 PHP7.4.
上重新启动它姑且称之为旧环境和新环境吧。旧的还完好无损。两者都在不同的服务器机器上。
字符集(html 元标记)设置为 utf-8。
Zend Framework 1 涉及两者。数据库位于 SQL 服务器上,由两个环境共享。我们使用SqlSrv驱动连接数据库(新环境),旧环境有PDO-Sql.
数据库的编码设置为Latin1_General_CI_AS
。
正在插入信息,并且 select编辑了 into/from 很多 table(插入,SELECT)。 Html 文本框和 文本区域正在使用中。
在旧环境中,任何用 textfields/-areas 编写的带有特殊字符(例如变音符号)的文本都以损坏的形式保存在数据库中,例如数据库中没有 ö 而是 ö table。然而,在屏幕上,在 select 语句之后,它显示为 ö(干净!)。
之前一切正常,但现在我们有了新环境。
假设有旧环境时代保存的旧条目,我们在新环境打开网站。内容显示 1:1 与在数据库 table 中看到的一样,换句话说:已损坏。这解释了为什么在新环境的帮助下保存的任何内容都能在屏幕上正确显示,因为特殊字符和变音符号在数据库中没有任何更改的情况下保存 table。
但是在旧环境网站上看不到新环境下的条目
使用 utf8_encode
或 utf8_decode
并没有多大帮助,要么看起来更糟,要么屏幕上没有文字可以看到。
在 table 中编写一些更改编码的脚本会造成混乱,因为由于旧环境仍在使用,因此无法轻松完成。
选项中没有提到编码选项,这些选项在名为 Zend_Db_Adapter_Sqlsrv
的 class 上使用。
好吧,我不相信 mb_detect_encoding
但我们已经尝试过了,但是它在 tables 的返回值上返回了 UTF-8。
那么人们会推荐什么?我可能遗漏了一些事实,但如果需要,我会为您提供更多信息。
这听起来与我过去解决过的问题非常相似。不幸的是我在ASP.NET中解决了它,所以我只能描述我做了什么,让你把它翻译成PHP。
所以问题的出现可能是因为您的旧系统使用的是 non-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;
}
希望这能让你有足够的时间继续下去......我已经很久没有这样做了,但疼痛仍然在我脑海中挥之不去!
由于这是别人做的项目,我们决定更新所有表并更正值。