繁体   English   中英

PHP将乱码的UTF8字符写入输出文件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM