【问题标题】:I'm trying to make sure my string has only valid UTF-8 characters in PHP. How can I do that? [duplicate]我试图确保我的字符串在 PHP 中只有有效的 UTF-8 字符。我怎样才能做到这一点? [复制]
【发布时间】:2013-01-10 22:06:08
【问题描述】:

可能重复:
PHP: replace invalid characters in utf-8 string in

我有一个字符串,其中包含无效字符(不是 UTF-8),例如以下显示 SUB:

我认为这是某种外国无效字符。

在 PHP 中有没有办法获取一个字符串并使用 preg_replace 或其他东西来确保我在我的字符串中只使用有效的 UTF-8 字符,而其他任何东西都会被删除?

谢谢。

【问题讨论】:

    标签: php regex string unicode utf-8


    【解决方案1】:

    首先,不存在无效的 UTF-8 字符。存在无效的 UTF-8 字节和字节序列,这意味着有人试图对您的服务器发起编码攻击。这些可以在即将到来的输入数据上使用mb_check_encoding 进行验证,如果您没有获得有效的 UTF-8,则会立即失败并显示 400 Bad Request。

    你所拥有的只是 SUBSTITUTE 控制字符,一个有效但不可打印的字符。

    最初打算用作传输控制字符 表示收到了乱码或无效字符。它有 当带内信令时,经常被用于其他目的 它提供的错误是不需要的,尤其是在稳健的方法 使用错误检测和纠正,或在预期错误的地方 稀有到足以将角色用于其他目的 建议。

    你可以使用这个正则表达式来摆脱它(and a few others):

    $reg = '/(?![\r\n\t])[\p{Cc}]/u';
    
    preg_replace( $reg, "", $str );
    

    【讨论】:

    • UTF-8 字符与 UTF-8 字节?你能详细说明一下吗?
    • 字符 = ABCΩ。 UTF-8 字节:0x41 0x42 0x43 0xce 0xa9。术语UTF-8 character 没有意义,UTF-8 是一种编码,它描述了字符如何表示为具体字节。
    • 我想知道您的意思是不是 存在无效的 UTF-8 字节 *sequences*
    • @SalmanA 是的,我现在添加了它。还有很多无效字节,永远无效的字节,甚至没有任何顺序。
    【解决方案2】:

    mb_check_encoding 函数应该可以做到这一点。

    mb_check_encoding("Jetzt gibts mehr Kanonen", "UTF-8");
    

    注意:我还没有测试过。

    【讨论】:

    • 这只是返回一个真或假,实际上并没有检测/告诉我哪个字符是有效的或删除它。不过关闭!
    • 如果您需要检查哪些字符无效,您可以遍历字符串并在每个字符上调用 mb_check_encoding,如果返回 false,则将其删除。
    • @Kyle 你的意思是每个字节,然后它会为任何多字节编码字节返回 false,除了 UTF-8 中的 ASCII 字节。
    猜你喜欢
    • 1970-01-01
    • 2015-05-01
    • 2020-08-01
    • 2015-12-02
    • 2022-11-09
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多