我正在尝试搜索并替换从 csv 文件解析的字符串中的特殊字符。当我用 vim 打开文本文件时,它显示字符是 。我一生都无法弄清楚这是要与 preg_replace 一起使用的字符。任何帮助,将不胜感激。
Thanks,
克里斯·爱德华兹
0x95 可能应该代表字符 U+2022 Bullet (•
),编码为Windows 代码页 1252。您可以使用以下方法在字节字符串中删除它:
$line= str_replace("\x95", '', $line);
或者你可以使用iconv
转换数据的字符集cp1252
to utf8
(或者您想要的任何其他编码),如果您有一个可以可靠地读取非 ASCII 字符的 CSV 解析器。否则,您可能想要删除all非 ASCII 字符,例如:
$line= preg_replace("/[\x80-\xFF]/", '', $line);
如果您的 CSV 解析器是fgetcsv()
你有问题。理论上,您应该能够在将字符串传递给之前将其作为字符串的预处理步骤str_getcsv()
(PHP 5.3)代替。不幸的是,这也意味着您必须自己读取该文件并逐行拆分它,并且考虑到引用的 CSV 值可能包含换行符,这并不是一件容易的事。当您编写了正确处理的代码时,您几乎已经编写了一个 CSV 解析器。因此,您实际上要做的是将文件读入字符串,进行预处理更改,将其写回临时文件,然后fgetcsv()
read that.
另一种方法是对返回的每个字符串进行后处理fgetcsv()
单独。但这也是不可预测的,因为 PHP 通过使用系统默认编码解码来破坏输入,而不是仅仅给你该死的字节。 Windows 之外的默认编码通常是 UTF-8,它本身不会读取 0x95 字节,因为那是无效的字节序列。虽然你可以尝试使用来解决这个问题setlocale()
更改系统默认编码,that这是非常糟糕的做法,它无法与您运行的任何其他依赖于系统区域设置的应用程序很好地配合。
总而言之,PHP 内置的 CSV 解析功能非常糟糕。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)