[请参阅下面的回答]
我使用preg_match_all从字符串中提取Hashtags,例如:
#tree#ztdf#n4#night
包含主题标签:tree,ztdf,n4,night
字符串可以是包含任何字符的任何语言,甚至是表情符号。因此,我在preg_match_all
:
preg_match_all('/#([\pL\p{Mn}]+)/u', $media_caption, $matches);
但是,某些字符的字节序列错误匹配:
我读到这是preg_match_all,utf-8编码和php here的问题。我还试图从pcre添加额外的utf-8标志(* UTF8):
preg_match_all('(*UTF8)/#([\p{L}\p{Mn}]+)/u', $media_caption, $matches)
..但后来我收到此错误
语法错误,意外'启用'T-flag
任何人都知道我如何使用preg_match_all
提取任何utf-8字符的#hashtags?
[编辑]
好吧..另一天,回到问题所以:所以我昨天意识到,json_decode()后得到的乱码只是用Windows命令行查看输出,无法处理UTF8。今天我使用Git Bash Console运行该程序
- 它显示了preg_match_all的输入,只是在UTF8中看起来很好。
- 在此之后,也没有问题:str_replace(array("\r\n", "\r", "\n",","), ";", $media_caption);
(替换所有换行符)
- 之后没有问题:preg_replace('
!\ s +!u', ' ', $media_caption);
(只用一个替换多个空格字符)
- 现在是有趣的部分:在此之后它甚至看起来很好:preg_match_all('/#([\p{L}\p{Mn}]+)/u', $media_caption, $matches);
例如,以下字符串的var_dump在Git Bash中为
string(15) "presadebuendía"
..但是在写入的csv / txt中,这是presadebuend㮡
,而Embalse de Buendía
正确地写入文件。
我目前正在研究可能在数据处理过程中混乱字符编码的部分代码。到目前为止,我已经尝试过:
header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
mb_internal_encoding("UTF-8");
并用这个函数替换fopen:function utf8_fopen_read($fileName) {
$fc = iconv('windows-1250', 'utf-8', file_get_contents($fileName));
$handle=fopen("php://memory", "rw");
fwrite($handle, $fc);
fseek($handle, 0);
return $handle;
}
..但这都没有解决问题。
答案 0 :(得分:0)
非常感谢大家的评论。我为指向错误的方向道歉:preg_match_all
和其他正则表达式函数不是我弄乱字符的问题。有些事情使我感到困惑(例如Windows命令行无法输出UTF8)。最后,我的代码中只有一个问题:
strtolower
函数,它将所有小写减少,包括特殊字符,如í(\ u00e)。解决方案是使用mb_strtolower代替,但仅限于字母字符。 当然,你无法发现这个问题,因为我没有在我的问题中包含特定的代码部分!在搜索问题期间,我还添加了
header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
mb_internal_encoding("UTF-8");
到我的php脚本文件,但这似乎对我的输出文件没有任何影响。无论如何,解决了我的问题。谢谢!