【发布时间】:2013-01-10 22:06:08
【问题描述】:
我有一个字符串,其中包含无效字符(不是 UTF-8),例如以下显示 SUB:
我认为这是某种外国无效字符。
在 PHP 中有没有办法获取一个字符串并使用 preg_replace 或其他东西来确保我在我的字符串中只使用有效的 UTF-8 字符,而其他任何东西都会被删除?
谢谢。
【问题讨论】:
标签: php regex string unicode utf-8
我有一个字符串,其中包含无效字符(不是 UTF-8),例如以下显示 SUB:
我认为这是某种外国无效字符。
在 PHP 中有没有办法获取一个字符串并使用 preg_replace 或其他东西来确保我在我的字符串中只使用有效的 UTF-8 字符,而其他任何东西都会被删除?
谢谢。
【问题讨论】:
标签: php regex string unicode utf-8
首先,不存在无效的 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 );
【讨论】:
ABCΩ。 UTF-8 字节:0x41 0x42 0x43 0xce 0xa9。术语UTF-8 character 没有意义,UTF-8 是一种编码,它描述了字符如何表示为具体字节。
【讨论】:
mb_check_encoding,如果返回 false,则将其删除。