刚才看到在 kDolphin 的中英双引号的问题中提到偶曾经说过的 WordPress 1.5 强制转义某些英文标点符号的问题,索性就在这里说说清楚吧。

事实上这个不是浏览器的问题,是 wp-includes\functions-formatting.php 中的 wptexturize() 函数在搞鬼。在页面被显示时(只是被显示时,数据库的标点符号还是正确的),它会把英文的单双引号和键盘上 TAB 键上面那个斜点符号以及其他一些东西都强行转换成了 Unicode 里的 CJK 标点符号,也就是全角的中文标点符号。这个函数会作用于站点标题、blog 标题、blog 内容、回复内容等地方。

它把标点符号变丑也就算了,关键是这样一转换会造成文章本来的意义被破坏,特别是有程序代码的文章。其实这就是我一直没有升级 1.5 的主要原因之一,另一个原因是懒得修改 style。 虽然可以自己很容易的修改一下这个函数,让 WP 1.5 不这么做,但是我不知道 WP 1.5 默认强制这么做会不会是因为某些地方依赖这个做法,比如不这么做可能会在某个地方出大问题。

大家来讨论一下吧。

以下是我注释掉的 wptexturize() 函数中的行

// This is a hack, look at this more later. It works pretty well though.
//$cockney = array("'tain't","'twere","'twas","'tis","'twill","'til","'bout",
//  "'nuff","'round");
//$cockneyreplace = array("'tain't","'twere","'twas",
//  "'tis","'twill","'til","'bout","'nuff","'round");
//$curl = str_replace($cockney, $cockneyreplace, $curl);

//$curl = preg_replace("/'s/", ''s', $curl);
//$curl = preg_replace("/'(\d\d(?:'|')?s)/", "'$1", $curl);
//$curl = preg_replace('/(\s|\A|")'/', '$1'', $curl);
//$curl = preg_replace('/(\d+)"/', '$1"', $curl);
//$curl = preg_replace("/(\d+)'/", '$1'', $curl);
//$curl = preg_replace("/(\S)'([^'\s])/", "$1'$2", $curl);
//$curl = preg_replace('/(\s|\A)"(?!\s)/', '$1"$2', $curl);
//$curl = preg_replace('/"(\s|\S|\Z)/', '"$1', $curl);
//$curl = preg_replace("/'([\s.]|\Z)/", ''$1', $curl);
//$curl = preg_replace("/ \(tm\)/i", ' ™', $curl);
//$curl = str_replace("''", '"', $curl);
Tags: ,

17 Responses to “WordPress 1.5 的标点符号问题”

  1. kDolphin Says:

    但是FF浏览的时候无论中英文引号全部用英文引号表示,IE在set default是英文的win环境下也并不会把英文引号转成中文的。
    wp输出中英文引号的时候都是输出成&quot这样的命名实体,于是IE就根据当前语言格式来显示引号,不知道我猜的对不对?

  2. Rainux Says:

    很抱歉你猜错了 ;) 可以打开我说的那个 WP 源代码文件,就在最前面的 wptexturize() 函数里就可以看到它使用 PHP 的正则表达式函数把那些英文标点直接替换成了形如 &8217; 这样的字符实体。而 Firefox 只是显示这些字符时看上去像英文的,把它们复制到记事本里,就原形毕露了。

  3. kDolphin Says:

    明白了,不懂程序所以看不明白。
    另外你的空间是哪里的?我那里实在不行想换。

  4. Rainux Says:

    偶用的是朋友的论坛空间,SEFans.com 的。

  5. 桑葚 Says:

    好像使用<code>就没这个问题了。

  6. Rainux Says:

    嗯,<pre> 也行。
    但是还是觉得不爽,比如偶的标题本来全是英文,结果中间那个 ' 变成了全角符号,巨丑……
    过一段有时间改改再换吧。

  7. Richard.H Says:

    不知道这个问题解决了没有。
    我按照你的方法把那几行给注释掉了,不过真的挺怕影响到WP的其他功能。

  8. Joseph's Blog » wordpress >1.5 中標點符號的自動轉換問題 Says:

    [...] 有這麼一篇 WordPress 1.5 的標點符號問題 ,理頭寫了取消這個功能的方法,這也同樣適用 [...]

  9. Joseph's Blog » wordpress >1.5 中標點符號的自動轉換問題 Says:

    [...] 有這麼一篇 WordPress 1.5 的標點符號問題 ,理頭寫了取消這個功能的方法,這也同樣適用 [...]

  10. Sparanoid Says:

    感谢,找到根源问题了,原来是这里在搞鬼 :D

    另外,我做了一个针对标点符号错误的插件,希望大家喜欢:
    http://www.sparanoid.com/2006/01/10/quotmarks-replacer/

  11. 杨之垚 Says:

    可以说是不存在问题的,该段语法的功能是对输出进行处理
    内部还是英文标点进行存储

  12. Rainux Says:

    嗯,大概是为了避免一些特殊符号造成 XHTML 语法错误,看来只要自己写作时小心,应该是没有问题的了。

  13. CSwiki站长日志 » Blog Archive » 解决WordPress符号自动转换产生的显示问题 Says:

    [...] 参考文章:《WordPress 1.5 的标点符号问题》 作者:Rainux [...]

  14. fivestone Says:

    3x,2.3里文件位置发生了变化,总体区别不大
    http://blog.fivestone.cn/?p=455

    难道老外也习惯做这种替换的?存成他们自己的ansi会不会乱码啊?

  15. WordPress中的标点符号转换 | Just For You - Mylover Says:

    [...] 简单做了一下试验,和主题样式无关,和汉化中文包无关,数据库里的原始数据也没有变化,应该是WordPress程序本身的问题。在Rainux的blog中查到了解决方案,但原文说的还是WordPress 1.5的版本,2.3版源程序做过改动,在类似的位置也很容易找到。 [...]

  16. WordPress中的标点符号转换 - Youngoat Says:

    [...] 简单做了一下试验,和主题样式无关,和汉化中文包无关,数据库里的原始数据也没有变化,应该是WordPress程序本身的问题。在Rainux的blog中查到了解决方案,但原文说的还是WordPress 1.5的版本,2.3版源程序做过改动,在类似的位置也很容易找到。 [...]

  17. dohkoos » Blog Archive » wordpress中关于全角符号自动替换的问题[zt] Says:

    [...] 简单做了一下试验,和主题样式无关,和汉化中文包无关,数据库里的原始数据也没有变化,应该是WordPress程序本身的问题。在Rainux的blog中查到了解决方案,但原文说的还是WordPress 1.5的版本,2.3版源程序做过改动,在类似的位置也很容易找到。 [...]

Leave a Reply