【问题标题】:PHP convert unicode spaces to ascii spacesPHP将unicode空格转换为ascii空格
【发布时间】:2013-12-05 00:20:00
【问题描述】:

所以我遇到了一个问题,我相信正在发生的事情是我正在接收使用一些 unicode 空格和一些 ascii 空格的数据,因此某些看起来相同的字符串是不等价的,例如,“防水” !=“防水”。但是,这些字符串在我的数据库中的显示方式有所不同,当存在多字节字符时,您通常会看到奇怪的字符:“防水”和“防水”。

我想要一种让所有空格都成为 ascii 空格的方法,或者如果更简单的话,所有空格都是多字节空格。

我尝试过使用 preg_replace,但字符串不再像有效的多字节字符串那样读取。 (字符串中的多字节字符将显示为垃圾)。

preg_replace('/[\pZ\pC]/',' ',$field);

我也尝试过使用 mb_ereg_replace,但没有效果。

mb_ereg_replace('/[\pZ\pC]/',' ',$field)

【问题讨论】:

标签: php unicode mbstring


【解决方案1】:

我想你正在寻找utf8_decode($field)

【讨论】:

  • 同意 - 这对我的数据库使用 ISO-8859-1 到 UTF-8 有效。
  • 如果我调用utf8_decode($field),该字段在网页上显示时仍然会出现乱码。我还需要在保存到数据库之前解决空格问题,否则它将存储具有各种空白的“防水”副本,而不仅仅是一个“防水”条目。
【解决方案2】:

看起来preg_replace('/[\pZ\pC]/u',' ',$field); 有效(忘记了正则表达式末尾的 u)

【讨论】:

  • 这对我有用,但请注意,它似乎比预期的更具侵略性。提供的正则表达式也匹配“标准”ASCII 空间。因此,如果您尝试替换 only Unicode 不间断空格(例如,使用非空格字符),这将替换比您想要的更多的字符。
【解决方案3】:

您称为 unicode 空格 的那些空格是不间断空格( & nbsp; 代表什么)。

保存数据时,您必须先对其进行清理。用普通空格替换所有不间断空格,用单个空格替换双空格,最后修剪字符串。

【讨论】:

    【解决方案4】:

    如果您愿意,可以通过以下方式查找并用标准 ascii 空格替换它们:

    $string = str_replace("\xc2\xa0", "\x20", $string);
    

    【讨论】:

    • 我认为这个解决方案是最好的——简单而实用。在我的 WordPress content_save_pre() 过滤器中为我工作,以杀死不间断的空格,用户在他们使用的任何内容编辑器(如 Word)中键入两个连续的空格 - 这会将其中一个空格转换为不间断的空格以保留2个空格。因为我们没有使用打字机,所以 2-space 是荒谬的——此外,它是浏览器中的类型流地狱
    • 这对我不起作用,但@Kai 的回答确实有效。
    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    相关资源
    最近更新 更多