PHP删除特殊字符以确保字符串是utf-8编码的

PHP删除特殊字符以确保字符串是utf-8编码的,php,utf-8,special-characters,Php,Utf 8,Special Characters,我不知道如何从字符串中删除特殊字符,以确保只包含uft-8+法语字符支持的字符。下面的base64字符串具有特殊字符,my Saniting函数无法删除这些字符,这导致在使用FPDF单元格等时无法打印文本。 如果您在解码字符串,您将看到特殊字符 // My sanitizing function static function remove_none_word_chars($string) { return preg_replace('/[^a-zA-Z0-9`_.,;@#%~\

我不知道如何从字符串中删除特殊字符,以确保只包含uft-8+法语字符支持的字符。下面的base64字符串具有特殊字符,my Saniting函数无法删除这些字符,这导致在使用FPDF单元格等时无法打印文本。 如果您在解码字符串,您将看到特殊字符

// My sanitizing function
static function remove_none_word_chars($string) {
        return preg_replace('/[^a-zA-Z0-9`_.,;@#%~\’\'\"+*\?\^\[\]\$\(\)\{\}\=!\<\>\|\-:\s\/\\sàâçéèêëîïôûùüÿñæœ]/ui', '', $string);
    }

74KnIFN1cGVydmlzZXIgbGUgdHJhdmFpbCBkZSBs4oCZZW5zZW1ibGUgZHUgcGVyc29ubmVsIGRlIHByb2R1Y3Rpb24sIGRlIGzigJllbnRyZXRpZW4gZXQgZGUgbGEgbWFpbnRlbmFuY2Ugc3VyIGxlIHF1YXJ0IGRlIG51aXQgZW4gdGVuYW50IGNvbXB0ZSBkZSBsYSBjb252ZW50aW9uIGNvbGxlY3RpdmU7Cu+CpyBBc3N1cmVyIHVuZSBib25uZSBnZXN0aW9uIGRlIGzigJllbnNlbWJsZSBkZXMgb3DDqXJhdGlvbnMgZGUgbOKAmXVzaW5lOwrvgqcgUGxhbmlmaWVyIGRlcyBvcMOpcmF0aW9ucyBlbiBmb25jdGlvbiBkZXMgYm9ucyBkZSBjb21tYW5kZTsK74KnIEFwcG9ydGVyIGxlcyBtb2RpZmljYXRpb25zIGV4aWfDqWVzIGxvcnMgZGVzIGRpZmbDqXJlbnRzIGF1ZGl0cyAoR2VuZXJhbCBEeW5hbWljcywgSVNPOTAwMSwgT0hTQVMxODAwMSwgZXRjLik7Cu+CpyBSZW5kcmUgY29tcHRlIGR1IHN1aXZpIGRlcyBvcMOpcmF0aW9ucyDDoCBjaGFxdWUgZGlyZWN0ZXVyIGRlIGTDqXBhcnRlbWVudCBsb3JzIGR1IGNoYW5nZW1lbnQgZGUgcXVhcnQ7Cu+CpyBWb2lyIGF1IHN1aXZpIGRlcyBidWRnZXRzIGV0IGVuIGFzc3VyZXIgbGUgcmVzcGVjdC4=
更新
谢谢大家的回答上述函数确实有效有一个条件语句我忘了在其他地方更改这是令人尴尬的。

你的函数有效,你只是在传递字符串之前没有解码它


像remove\u none\u word\u charsbase64\u decode$string一样使用它。如果函数正常工作,则在传递字符串之前不会对其进行解码


使用它就像删除\u none\u word\u charsbase64\u decode$string

这里有一种删除非数字和字母字符的方法

static function remove_none_word_chars($string) {
    return preg_replace('~[^\\pL\d]+~u', ' ', $string);
}

查看它的操作:

这里有一种删除非数字和字母字符的方法

static function remove_none_word_chars($string) {
    return preg_replace('~[^\\pL\d]+~u', ' ', $string);
}

查看它的实际操作:

我相信您可以使用此功能

$test = utf8_encode("your text here");
$new = utf8_decode($test);

我相信你可以使用这个功能

$test = utf8_encode("your text here");
$new = utf8_decode($test);

要删除非打印字符,可以使用正则表达式

$data= preg_replace('/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF8-\xFF]/','',$data);

// Or to preserve extended characters, use the below expression.
// Mind you many of these may still be non-printing.
$data= preg_replace('/(?!\n)[[:cntrl:]]+/','',$data);
这是为了从发送给错误日志的字符串中删除非打印字符

这将删除所有不在所提供列表中的字符,或第二个示例中的控制字符。名单如下:

\x0A = [newline]
\x20-\x7E = [space] ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
\xC0-\xD6 = À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö
\xD8-\xF6 = Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö
\xF8-\xFF = ø ù ú û ü ý þ ÿ

至于UTF-8的编码,这应该不是什么大问题,但是有一些函数可用,例如,可能会有所帮助。我相信在删除非打印字符之前,您必须在字符串上调用它。但是,请注意,如果字符串格式不正确,或者已经是UTF-8格式,这可能会使字符串无法读取。

要删除非打印字符,可以使用正则表达式

$data= preg_replace('/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF8-\xFF]/','',$data);

// Or to preserve extended characters, use the below expression.
// Mind you many of these may still be non-printing.
$data= preg_replace('/(?!\n)[[:cntrl:]]+/','',$data);
这是为了从发送给错误日志的字符串中删除非打印字符

这将删除所有不在所提供列表中的字符,或第二个示例中的控制字符。名单如下:

\x0A = [newline]
\x20-\x7E = [space] ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~
\xC0-\xD6 = À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö
\xD8-\xF6 = Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö
\xF8-\xFF = ø ù ú û ü ý þ ÿ

至于UTF-8的编码,这应该不是什么大问题,但是有一些函数可用,例如,可能会有所帮助。我相信在删除非打印字符之前,您必须在字符串上调用它。但是,请注意,如果字符串的格式不正确,或者已经是UTF-8格式,这可能会使字符串无法读取。

UTF-8有超过一百万个字符请删除您的问题。UTF-8有超过一百万个字符请删除您的问题。这很有效,但我必须添加/u$s=preg\u replace'/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF8-\xFF]/u',$string此功能正常,但我必须添加/u$s=preg\u replace'/[^\x0A\x20-\x7E\xC0-\xD6\xD8-\xF6\xF6\xF8-\xFF]/u',$string