【问题标题】:Replacing low ASCII characters in UTF-16-encoded string using PHP's str_replace function使用 PHP 的 str_replace 函数替换 UTF-16 编码字符串中的低 ASCII 字符
【发布时间】:2012-09-15 08:40:28
【问题描述】:

我有一些用于文本过滤的 PHP 代码。在过滤过程中,一些 ASCII 字符(例如与号 (&) 和波浪号 (~))会临时转换为低位 ASCII 字符(例如十进制代码点 4 和 5)。就在生成最终过滤输出之前,转换被还原。

$temp = str_replace(array('&', '~'), array("\x04", "\x05"), $input);
... some filtering code to work with $temp ...
$out = str_replace(array("\x04", "\x05"), array('&', '~'), $temp);

这适用于使用 8 位代码单元(例如 UTF-8 和 ISO 8859-1)的字符编码的输入文本。但我不确定以更大的代码单元编码的输入,例如 UTF-16 或 UTF-32。第一个转换步骤会破坏输入文本的格式吗?由于输入的某些预先存在的字符,在还原步骤期间是否会出现一些冲突? PHP 设置没有overload 多字节字符串函数。

有人可以评论吗?谢谢。

【问题讨论】:

    标签: php character-encoding str-replace utf-16 well-formed


    【解决方案1】:

    str_replace 工作正常,只要传递给它的所有字符串都采用相同的编码。它只是对数据进行二进制比较/替换,因此实际编码并不重要。

    这就是this list 中没有 mb_str_replace 的原因。

    【讨论】:

    • “所有字符串”是指我提供的示例代码最后一行中的“&”和“~”应该是 UTF-16 编码,如果输入文本是 UTF- 16?也就是说,PHP 代码本身(PHP 文件)应该是 UTF-16 吗?
    • 最好,是的。否则,'&' 可能会意外匹配输入字符串中 UTF-16 字符的一部分。不过,我建议不要使用 UTF-16。 UTF-8 是事实上的在线标准,UTF-16 几乎没有优势。 UTF-8 适合大小,UTF-32 适合简单,而 UTF-16 在大多数情况下都不适合。
    • 嗯。输入文本的编码不在我的控制范围内(我想避免将其转换为 UTF-8)。谢谢。
    • *I want to avoid converting it to UTF-8* 为什么?您也必须以给定的编码输出输出,对吗?我认为最好的工作方式是对所有数据使用单一编码(最好是 UTF-8)。混合编码是自找麻烦。在“过去”中,混合 ANSI 代码页很麻烦(对许多人来说仍然如此),但现在您通过混合 Unicode 编码引入了一个全新的混乱水平。请注意,UTF-16 还会在 Windows 和 Linux 之间引入字节顺序问题。这是只使用 UTF-8 的另一个原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    相关资源
    最近更新 更多