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

时间:2017-08-21 12:15:11

标签: php encoding utf-8 preg-match-all hashtag

[请参阅下面的回答]

我使用preg_match_all从字符串中提取Hashtags,例如:

  

#tree#ztdf#n4#night

包含主题标签:tree,ztdf,n4,night

字符串可以是包含任何字符的任何语言,甚至是表情符号。因此,我在preg_match_all

中启用了utf-8标志(/ u)
preg_match_all('/#([\pL\p{Mn}]+)/u', $media_caption,  $matches);

但是,某些字符的字节序列错误匹配:

enter image description here

我读到这是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; 
} 

..但这都没有解决问题。

1 个答案:

答案 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脚本文件,但这似乎对我的输出文件没有任何影响。无论如何,解决了我的问题。谢谢!