|
|
最近在弄DeDeCMS的精简版本,删除一些多余的文件,和不用的功能,精简下,然后加入几个企业站常用的功能,就在这时候问题出现了!
* u' O4 }7 B: x" W" n- s! Z/ F' K1 J, T
; i! O1 l4 Y# C; j在加入 发布招聘功能的时候,出现问题了,就是修改招聘信息的时候。编辑器内容不显示,只显示英文,中文不显示,以前记得开发此功能没这问题啊!然后各种原因找不出,没办法,从编辑器函数入手,一步一步查,查到4 o! Y2 z! B4 \! B
9 L! X: N. A$ W5 R9 a0 }此目录include/ckeditor/ckeditor_php5.php文件
j, ?3 v0 {6 P( F( K; ?: _8 R3 ^6 N! J5 q" A2 }* W
8 ?) c; f1 _- K, m- W$ o6 M: o
代码块:; E( V% V& Y* c' a4 Y* g
$out = "<textarea name=\"" . $name . "\"" . $attr . ">" .htmlspecialchars($value). "</textarea>\n";" {' s2 {) v% Z( a* O/ t+ e
这里时出问题了,,后来查了一些资料知道哪里现问题了!- M4 Z; K( E& Q
- b/ w, D' M1 g8 m: e
, u5 ]9 P- |$ u, Q2 k* a I4 {PHP 5.4.3 环境中测试了一个在 PHP 5.2 环境下运行正常的程序,却发现本应正常提交一个中文字符串到数据库的代码却提交了一个空字符串,经过排查,该字符串在经 htmlspecialchars 函数转义之前正常,而在转义之后却变成了空字符串。调用例子如下:! s3 Y7 L! j" S' b
( F; v9 u' y7 x! ~4 D C
" D) x9 s; Y5 L" s+ q. s7 q$str = '中文字符串';- t; X2 m) ~4 _7 F8 J. @
$str_converted = htmlspecialchars($str);3 Q* G; z5 d8 B( c2 b& A
echo $str_converted;
, w- W% l$ Q' A6 Z) M7 b; c( I4 N遂查看PHP手册,获知 htmlspecialchars 函数原型如下:
Q* B- ^/ y/ Z+ a6 K) Y' Z. i! B4 G% z+ |$ k- }
string htmlspecialchars ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )
! j% c/ B- _' N' ]更新日志里面又有提到:
$ R- n* j' h% `, H2 [) l% v' U h' |, O4 B: c' ?# G
5.4.0 The default value for the encoding parameter was changed to UTF-8. & J* Q* S# {) [# d0 W
5.4.0 The constants ENT_SUBSTITUTE, ENT_DISALLOWED, ENT_HTML401, ENT_XML1, ENT_XHTML and ENT_HTML5 were added. 2 s" E; ?8 `' _5 s( D5 L9 `# J
PHP 从 5.4.0 版本开始第三个参数字符串编码的默认值改成了 UTF-8,而我这段代码中的中文编码正好是 GB2312 编码的,跟现在的默认参数不一致,于是更改调用参数如下:
+ M% F' |9 `: M4 |, o& r) W- I0 u/ I' \
, ]( o" }% ` Z
$str = '中文字符串';
& W8 _' m! Q8 I$ }5 F) _# 为了与旧环境兼容,这里第二个参数没有组合使用 PHP 5.4 新加入的 ENT_HTML401 常量
/ A4 R) _+ i+ E2 \$str_converted = htmlspecialchars($str, ENT_COMPAT ,'GB2312');3 A D0 A5 ^2 h9 p9 P* u F
echo $str_converted;- E2 m& V% `( m7 r" _. l1 o
这样,“中文字符串”就可以正常显示了。为了使 PHP 5.4 之前环境中编写的代码能够向前兼容,建议调用 htmlspecialchars 函数的的时候都提供字符串编码参数。
K9 }; j/ E* v9 p0 Q# j& T# a3 S7 s. U7 L# R g- u j0 \. G( l
* o' X3 U" T2 M! m; b
所以DeDeCMS 这个编辑器Bug 只有在PHP 5.4 环境下 使用GBK编码才会导致这样的问题,DeDeCMS您如果是运行在PHP 5.4 环境下,正好又使用GBK编码的话,建议将此文件里的' P- a1 h0 W& s* G q$ g0 B" c% y
+ z+ Z# G |+ v, y4 Minclude/ckeditor/ckeditor_php5.php文件9 r) @1 u2 @% K
; p. \4 D$ P; r2 q& n# `
找到代码* T5 Y* d- g* u7 Y j7 V D
$out = "<textarea name=\"" . $name . "\"" . $attr . ">" .htmlspecialchars($value). "</textarea>\n";
& T# L7 |3 m! R, u2 W9 N* O9 h1 Q- ?( Y/ S2 {( s/ B, s
改成:
# l2 r# G4 e3 I$out = "<textarea name=\"" . $name . "\"" . $attr . ">" .htmlspecialchars( $value, ENT_COMPAT, 'GB2312' ). "</textarea>\n"; c$ B+ G+ U8 @3 j
1 R- [, `, x' O* z% V# m: ^ |
|