我最近迁移了一个运行旧 PHP 商店的 Web 服务器,运行起来有点棘手:让我先解释一下。如果您想在 thedailywtf 或 codinghorror 上发布此内容,欢迎您。
店主在自己的机器上运行一个 exe 来更新产品。该程序生成(来自 MDB Access 数据库)自己的 PHP 文件,并最终将它们连同特殊文件updatedb.php
和一个db.sql
文件(可从 公开访问wwwroot
)一起上传到目标服务器。然后,exe 文件调用一个带有安全参数的POST
to updatedb.sql
,以防止外国人调用 PHP 脚本(我不会解释哪个公共文本文件的第一行包含密码)。
那么 PHP 会做什么呢?只需清除数据库并重新插入所有数据,即使实际的商店页面不从 MySQL 加载其数据,但每个生成的 PHP 文件都包含静态描述和图像链接。updatedb.php
从文件加载数据db.sql
并在新的 SQL 连接中运行每一行。
配置差异
新旧服务器均运行Apache 2
和vsftpd
。我发现两者的语言环境不同:旧服务器使用ISO-8859-15
charmap ,而新服务器UTF-8
。vsftpd
配置完全相同
字符集问题
我发现大多数非 ASCII 符号(例如€
uro°
和重音字母àèéìòù
)都被搞乱了,所以它们无法在 SQL 语句中运行(您可能猜到没有进行转义,我可以证实这一点!)
问题
由于客户不想破坏他们的商店,迫使我为他们的 vhost 添加几个特殊的 PHP 配置指令,我该如何修复通过 FTP 传输的文件的字符编码?
我考虑过配置vsftpd.conf
(来源)
# Enable character convertion. Supported UTF-8 (Russian chars) = UTF8,
# Win-1251 = WIN1251 or 1251, Koi8-r = KOI8R or 878, IBM 866 = DOS or 866.
convert_charset_enable=1
# Define charset local
local_charset=UTF8
# Define default charset on remote host
remote_charset=ISO-8859-15
但强制将远程字符集设置为 iso-8859-15 似乎不太好。幸运的是,这是唯一一个使用 Windows XP FTP 传输的客户。
[更新] 我刚刚发现了我的老问题FTP 传输期间欧元字符混乱关于类似的问题。在那种情况下,SQL 字符串被从 € 符号中截断。现在,查询被执行时带有混乱的 € 符号。