PHP 将乱码 UTF8 字符写入输出文件
PHP writes garbled UTF8 characters to output file
[请看下面的答案]
我正在使用 preg_match_all 从字符串中提取标签,例如:
#tree#ztdf #n4# night
包含主题标签: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 的问题 here. I also tried to add the additional utf-8 flag (*UTF8) from pcre:
preg_match_all('(*UTF8)/#([\p{L}\p{Mn}]+)/u', $media_caption, $matches)
..但是我收到了这个错误
syntax error, unexpected 'Enabled' T-flag
有人知道我如何使用 preg_match_all
提取带有任何 utf-8 字符的#hashtags 吗?
[Edit]
Ok..改天,回到问题:所以我昨天意识到,我在 json_decode() 之后得到的乱码只是用 Windows 命令行查看输出,无法处理 UTF8。今天我 运行 程序使用 Git Bash 控制台和
- 它显示 preg_match_all 的输入在 UTF8 中看起来很好。
- 在此之后,也没有问题:str_replace(array("\r\n", "\r", "\n",","), ";", $media_caption);
(替换所有换行符)
- 之后没有问题:preg_replace('
!\s+!u', ' ', $media_caption);
(仅用一个字符替换多个 space 字符)
- 现在是有趣的部分:在这之后它甚至看起来还不错: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;
}
.. 但是 none 解决了这个问题。
非常感谢大家的评论。对于指向错误的方向,我深表歉意: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-脚本文件,但这似乎对我的输出文件没有任何影响。无论如何,解决了我的问题。谢谢!
[请看下面的答案]
我正在使用 preg_match_all 从字符串中提取标签,例如:
#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. I also tried to add the additional utf-8 flag (*UTF8) from pcre:
preg_match_all('(*UTF8)/#([\p{L}\p{Mn}]+)/u', $media_caption, $matches)
..但是我收到了这个错误
syntax error, unexpected 'Enabled' T-flag
有人知道我如何使用 preg_match_all
提取带有任何 utf-8 字符的#hashtags 吗?
[Edit]
Ok..改天,回到问题:所以我昨天意识到,我在 json_decode() 之后得到的乱码只是用 Windows 命令行查看输出,无法处理 UTF8。今天我 运行 程序使用 Git Bash 控制台和
- 它显示 preg_match_all 的输入在 UTF8 中看起来很好。
- 在此之后,也没有问题:str_replace(array("\r\n", "\r", "\n",","), ";", $media_caption);
(替换所有换行符)
- 之后没有问题:preg_replace('
!\s+!u', ' ', $media_caption);
(仅用一个字符替换多个 space 字符)
- 现在是有趣的部分:在这之后它甚至看起来还不错: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;
}
.. 但是 none 解决了这个问题。
非常感谢大家的评论。对于指向错误的方向,我深表歉意: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-脚本文件,但这似乎对我的输出文件没有任何影响。无论如何,解决了我的问题。谢谢!