Php 搜索和替换特殊字符

Php 搜索和替换特殊字符,php,Php,我试图搜索和替换从csv文件解析的字符串中的特殊字符。当我用vim打开文本文件时,它显示字符为。我一辈子都搞不懂用preg_替换什么角色。任何帮助都将不胜感激 谢谢 Chris Edwards0x95可能代表字符U+2022 Bullet(•),编码为。您可以使用以下方法在字节字符串中删除它: $line= str_replace("\x95", '', $line); 或者您可以使用iconv将数据的字符集从cp1252转换为utf8(或任何您想要的其他编码),前提是您有一个能够可靠读取非A

我试图搜索和替换从csv文件解析的字符串中的特殊字符。当我用vim打开文本文件时,它显示字符为。我一辈子都搞不懂用preg_替换什么角色。任何帮助都将不胜感激

谢谢


Chris Edwards

0x95可能代表字符U+2022 Bullet(
),编码为。您可以使用以下方法在字节字符串中删除它:

$line= str_replace("\x95", '', $line);
或者您可以使用
iconv
将数据的字符集从
cp1252
转换为
utf8
(或任何您想要的其他编码),前提是您有一个能够可靠读取非ASCII字符的CSV解析器。否则,您可能希望删除所有非ASCII字符,例如:

$line= preg_replace("/[\x80-\xFF]/", '', $line);
如果您的CSV解析器是
fgetcsv()
,则会出现问题。理论上,在将字符串传递给
str_getcsv()
(PHP5.3)之前,您应该能够将其作为字符串的预处理步骤。不幸的是,这也意味着您必须自己读取文件并将其逐行拆分,鉴于引用的CSV值可能包含换行符,这不是一件小事。当您编写正确处理的代码时,您基本上已经编写了一个CSV解析器。因此,您实际上需要做的是将文件读入字符串,进行预处理更改,将其写回临时文件,然后让
fgetcsv()
读取该文件

另一种方法是分别对
fgetcsv()
返回的每个字符串进行后处理。但这也是不可预测的,因为PHP通过使用系统默认编码对输入进行解码,而不是仅仅给你该死的字节,从而破坏了输入。Windows之外的默认编码通常是UTF-8,它本身不会读取0x95字节,因为这是一个无效的字节序列。虽然您可以尝试使用
setlocale()
来改变系统默认编码,但这是一种非常糟糕的做法,它不会很好地与您运行的任何依赖于系统语言环境的应用程序配合使用


总之,PHP内置的CSV解析功能非常糟糕。

0x95可能表示字符U+2022 Bullet(
),编码为。您可以使用以下方法在字节字符串中删除它:

$line= str_replace("\x95", '', $line);
或者您可以使用
iconv
将数据的字符集从
cp1252
转换为
utf8
(或任何您想要的其他编码),前提是您有一个能够可靠读取非ASCII字符的CSV解析器。否则,您可能希望删除所有非ASCII字符,例如:

$line= preg_replace("/[\x80-\xFF]/", '', $line);
如果您的CSV解析器是
fgetcsv()
,则会出现问题。理论上,在将字符串传递给
str_getcsv()
(PHP5.3)之前,您应该能够将其作为字符串的预处理步骤。不幸的是,这也意味着您必须自己读取文件并将其逐行拆分,鉴于引用的CSV值可能包含换行符,这不是一件小事。当您编写正确处理的代码时,您基本上已经编写了一个CSV解析器。因此,您实际上需要做的是将文件读入字符串,进行预处理更改,将其写回临时文件,然后让
fgetcsv()
读取该文件

另一种方法是分别对
fgetcsv()
返回的每个字符串进行后处理。但这也是不可预测的,因为PHP通过使用系统默认编码对输入进行解码,而不是仅仅给你该死的字节,从而破坏了输入。Windows之外的默认编码通常是UTF-8,它本身不会读取0x95字节,因为这是一个无效的字节序列。虽然您可以尝试使用
setlocale()
来改变系统默认编码,但这是一种非常糟糕的做法,它不会很好地与您运行的任何依赖于系统语言环境的应用程序配合使用


总之,PHP内置的CSV解析功能非常糟糕。

根据Bobince的建议,以下内容对我很有用:

分析\u文件()->


根据Bobince的建议,以下几点对我起了作用:

分析\u文件()->


你能检查一下使用了什么字符编码吗<代码>文件-bi[文件名]您能检查一下使用了什么字符编码吗<代码>文件-bi[文件名]