phpmyadmin3.x版在windows下的新版本php里日期显示乱码的补丁方案

> 这个问题应该在php5.5.30 与 7.3.11中不再出现。或许,这是灵异问题。 
因为近年一直使用在apache里以fast-cgi模式开以一个php5.3运行phpmyadmin;
前几天偶然发现这个问题并不存在了,或许以前真的只是灵异现象。

现象:

一直使用的phpmyadmin3.5版本(RELEASE-DATE-3.5.0,一个做了配置优化的版本 phpMyAdmin_3.5_path8.net),这个版本比较简洁,更新的pma有些臃肿。然而,在windows下使用php5.5, 及php7.0,都发现日期显示成乱码

phpmyadmin_35_date_string_bad

方案:

文件 libraries/common.lib.php , 行1648行

        $format = __('%B %d, %Y at %I:%M %p');

改成

        $format = '%Y-%m-%d %H:%M:%S';

即可,日期格式显示格式示例 2016-01-27 11:49:07

phpmyadmin_35_date_string_fixed

原因:

PMA_localisedDate函数使用了strftime()函数,该strftime函数第一个参数为日期格式,phpmyadmin源程序使用了带中文的格式字符串;而在windows下的php版本,在做格式化时会转成乱码。经确认linux下没有这个问题,pma是正常的。

更好的方案

$format = __('%B %d, %Y at %I:%M %p');
//patch for win
$fs_ver=explode('.',PHP_VERSION);
if( $fs_ver[0] > 5 or ($fs_ver[0] = 5 && $fs_ver[1] >= 4) ){
    if(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'){
        $format = '%Y-%m-%d %H:%M:%S';
    }
}

亦即:github. 这样可以更好的兼容性。

 

ftp目录文件名乱码/使用原始ftp命令解决

对乱码的客户端,直接向服务器端发送原始的FTP命令:

opts utf8 off

对于flashFXT,可以按

菜单 - 命令 - 原始命令

输入

opts utf8 off

回车(或点确定)

再刷新服务端的目录列表,即正常显示

如果不行,可以试试发送ftp原始命令 opts utf8 on

原因解析:

按RFC 2610规定的方式,默认使用UTF-8。而某些服务器和客户端并不用此标准。即,server和client对话时,FTP服务器直接使用UTF-8发送数据,除非对方大喊一声opts  utf8 off ;而一些ftp产品则数默认使用本地编码对话,除非对方说一声opts  utf8 on 。所以,当服务器端与客户端不统一时,就出现了一个讲UTF8,一个用本地编码,就出现了乱码。

数据库中乱码记录查找与删除/sql server剔除乱码行

乱码一般都是正常编码被错误的解析而导致。每个错误的编码,都会对应着一个正确的编码,也就是,出现频率高的乱码字符,其实就是出现高频字符(一般都是汉字)对应的乱码。
所以说,如果找到高频字符对应的乱码,在sql表里,使用like 查询即可以找到乱码行。
也就是说,查找到一系列高频乱码字符,就可以很容易的查找到绝大多数乱码行。
由于有乱码的表里存储的数据可能是不同行业、不同领域的信息,高频汉字可能不尽相同。(生命科学领域里,细、胞、蛋、白、质、核、酸等这些字频率会非常高;而计算机领域里,内、存、储、变、量、进、程等汉字会是调频汉字;其它领域亦类似)。
所以查找剔除乱码记录时,最好是整理一个最准确乱码字符表。
下面给出一个整理乱码表比较直接、有效的方法(是笔者所探索发现的方法):
1. 找到一定数量的乱码记录(建议在200条以上)
2. 把这些乱码整理出来,并拆分成单字,并统计每个单字出现频率。(建议使用excel+UE/editplus等工具)
3. 取最高频的50个单字(这里当然是要找明显是乱码的单字;也可以不是50个字,80个100个也行)
4. 使用UE或excel生成对应的50个sql like语句,形式如下
select * from [乱码表] where [乱码字段] like '%锛%'
select * from [乱码表] where [乱码字段] like '%绂%'
select * from [乱码表] where [乱码字段] like '%脠%'
select * from [乱码表] where [乱码字段] like '%┖%'
select * from [乱码表] where [乱码字段] like '%锲%'
......

为了查询方便,最把生成一个union语句,如下
select * from [乱码表] where [乱码字段] like '%悎%' union
select * from [乱码表] where [乱码字段] like '%灏%' union
select * from [乱码表] where [乱码字段] like '%楁%' union
select * from [乱码表] where [乱码字段] like '%闀%' union
select * from [乱码表] where [乱码字段] like '%寰%' union
select * from [乱码表] where [乱码字段] like '%阍%' union
.....
5. 使用上步生成的sql语句查询,查询到结果基本上全部都是乱码行(把乱码记录复制下来,下一步有用),把这些行的主键ID号复制粘贴到ue/editplus,整理成一个逗号拼接形式,就可以使用一个in语句删除
delete from [乱码表] where [主键id] in(num1,num2,num3,...)
[如果上步语句查询结果里有非乱码行,则明记下非乱码行的ID号,在生成delete ... in ... 语句时,剔除这些ID号,就可保证万无一失]
6. 如果需要更进一步删除乱码,可对上一步记下的乱码记录做以下步骤:
单字分隔-统计词频-取法高频乱码单字-整理sql like语句-查询-确认-生成delete... in...语句-删除
这一过程可以继续多次进行,直至没有乱码行为止。

[注]
1. “乱码”只是习惯说法。乱码单字其实也都是正常的字符——多半是比较生僻的汉字,类似于时下流行已久的“火星文”。其中当然也有一些常见的汉字。
2. 上面提到清理乱码方法是提到的"200条乱码记录"、"50个乱码单字"是笔者操作中使用,你也可以增减这些数目,以达到最佳的清理效果。