[英]PHP writes garbled UTF8 characters to output file
[请参阅下面的答案]
我正在使用preg_match_all从字符串中提取标签,例如:
#tree#ztdf#n4#晚
包含主题标签:tree,ztdf,n4,night
字符串可以是具有任何字符的任何语言,甚至包括表情符号。 因此,我在preg_match_all
启用了utf-8标志(/ u):
preg_match_all('/#([\pL\p{Mn}]+)/u', $media_caption, $matches);
但是,某些字符的字节序列错误地匹配:
我读到这是preg_match_all,utf-8编码和php的问题 。 我还尝试从pcre添加其他utf-8标志(* UTF8):
preg_match_all('(*UTF8)/#([\p{L}\p{Mn}]+)/u', $media_caption, $matches)
..但后来我得到这个错误
语法错误,意外的“ Enabled” T标志
有人知道我如何使用preg_match_all
使用任何utf-8字符提取#hashtags吗?
[编辑]
好的,第二天,回到问题上来:所以我昨天才意识到,我在json_decode()之后得到的乱码只是通过Windows命令行查看输出而已,而这不能处理UTF8。 今天,我使用Git Bash Console运行该程序,并且-在pref_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;
}
..但这些都不能解决问题。
非常感谢大家的评论。 我为指向错误的方向而道歉: 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-script文件,但这似乎对我的输出文件没有任何影响。 无论如何,解决了我的问题。 谢谢!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.