【问题标题】:Replace "abc123def" with "abc 123 def" in multibyte string在多字节字符串中将“abc123def”替换为“abc 123 def”
【发布时间】:2010-12-05 05:26:17
【问题描述】:

通常我会这样做。

$str = preg_replace('#(\d+)#', ' $1 ', $str);

如果我知道它将是 utf-8,我会在模式中添加一个小写的“u”修饰符,我想我会很好。但由于有报道称 utf-8 占用的存储空间是使用本机字符集的 2 倍,在某些情况下是 3 倍,因此我试图不将应用程序限制为 utf-8。

因此,我试图远离我最喜欢的 preg_ 函数。

到目前为止,大多数事情都相当简单,但我有点卡在我通常在 preg_ 中使用字符类的替换上,例如“\d”。

【问题讨论】:

    标签: php multibyte pcre


    【解决方案1】:

    使用mb_convert_encoding 实现存储包装器,因此您只需在内部操作 UTF-8。

    (我还是觉得你应该require UTF-8,省去大家很多麻烦。)

    【讨论】:

    • 我认为我最终要在这里做的是继续使用脚本,所有基本功能都将继续使用 mb_ 函数,可以更改编码,并标记一些高级功能,以便它们仅在活动编码为 utf-8 时可用。
    【解决方案2】:

    我认为 UTF-8 编码使得编码输出中字节值为 127 或更少的任何内容始终是与该字节值匹配的 ASCII 字符,而不是多字节序列的一部分。所以在这种情况下你可以继续假装编码是 ASCII 而不会引起问题(因为空格和数字都是 ASCII)。

    请参阅http://en.wikipedia.org/wiki/UTF-8 中的描述,其中显示多字节序列中的所有字节都设置了最高有效位(例如,都 > 127)。

    【讨论】:

    • 这对于 UTF-8 和 ISO-8859-n 来说绝对是正确的,但我认为他特别担心会存储例如更广泛的编码。亚洲文字更紧凑。 (我认为不值得担心;需要 UTF-8,快乐地生活。)
    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多