在.csv文件中写入时PHP的编码问题
我正在使用一个php数组,其中包含一些从以前的刮取过程(使用在.csv文件中写入时PHP的编码问题,php,web-scraping,utf-8,character-encoding,Php,Web Scraping,Utf 8,Character Encoding,我正在使用一个php数组,其中包含一些从以前的刮取过程(使用Simple HTMLDOM Parser)解析的值。我通常可以打印/回显此数组的值,该数组包含特殊字符é、á、è等。但是,问题如下: 当我使用fwrite在.csv文件中保存值时,某些字符未成功保存。例如,Székesfehérvár在我的php视图中以HTML的形式显示,但另存为Szé;凯斯菲é;rv和225;r在我用上面的php脚本生成的.csv文件中 我已经在php脚本中设置了一些内容: 我正在抓取的页面似乎是
Simple HTMLDOM Parser
)解析的值。我通常可以打印
/回显
此数组的值,该数组包含特殊字符é、á、è等。但是,问题如下:
当我使用fwrite
在.csv文件中保存值时,某些字符未成功保存。例如,Székesfehérvár
在我的php视图中以HTML
的形式显示,但另存为Szé;凯斯菲é;rv和225;r
在我用上面的php脚本生成的.csv
文件中
我已经在php脚本中设置了一些内容:
- 我正在抓取的页面似乎是utf-8编码的
- 我的PHP脚本在标题中也声明为utf-8
- 我在代码中的不同位置尝试了很多
iconv
和mb_encode
方法
- 注意当我使用json_encode为我的php数组创建一个JS console.log时,字符也会被破坏,可能与我正在抓取的页面的原始编码有关
这是脚本的一部分,它是在.csv
文件中写入值的部分
将这一行放在代码中
header('Content-Type: text/html; charset=UTF-8');
希望这对你有帮助 将这一行放在代码中
header('Content-Type: text/html; charset=UTF-8');
希望这对你有帮助 Excel在显示utf8编码的csv文件时出现问题。我以前见过这个。但您可以尝试utf8 BOM。我试过了,对我有用。这只是将这些字节添加到utf8字符串的开头:
$line_txt .= chr(239) . chr(187) . chr(191) . $item . "\t";
有关更多信息:
或者,您可以使用Excel中的文件导入功能,并确保文件源显示为65001:Unicode(UTF8)
。它应该正确显示您的文本,您需要将其保存为Excel文件以保留格式。Excel在显示utf8编码的csv文件时遇到问题。我以前见过这个。但您可以尝试utf8 BOM。我试过了,对我有用。这只是将这些字节添加到utf8字符串的开头:
$line_txt .= chr(239) . chr(187) . chr(191) . $item . "\t";
有关更多信息:
或者,您可以使用Excel中的文件导入功能,并确保文件源显示为65001:Unicode(UTF8)
。它应该正确显示您的文本,您需要将其保存为Excel文件以保留格式。解决方案(由@misorude提供):
当从网页中刮取HTML内容时,调试中显示的内容与脚本中真正刮取的内容之间存在差异。我不得不使用html\u entity\u decode
,让PHP解释我所获取的html代码的真实值,而不是浏览器的解释
要在将值存储到某个位置之前验证值的良好检索,可以尝试在JS中使用console.log来查看值是否正确驱动:
PHP
//decoding numeric HTML entities who represents "Sóstói Stadion"
$b = html_entity_decode("Sóstói Stadion");
Javascript(要测试):
var b=;
//正确打印“Sóstói体育场”
控制台日志(b);
解决方案(由@misorude提供):
当从网页中刮取HTML内容时,调试中显示的内容与脚本中真正刮取的内容之间存在差异。我不得不使用html\u entity\u decode
,让PHP解释我所获取的html代码的真实值,而不是浏览器的解释
要在将值存储到某个位置之前验证值的良好检索,可以尝试在JS中使用console.log来查看值是否正确驱动:
PHP
//decoding numeric HTML entities who represents "Sóstói Stadion"
$b = html_entity_decode("Sóstói Stadion");
Javascript(要测试):
var b=;
//正确打印“Sóstói体育场”
控制台日志(b);
试试看
$file = fopen('myFileName.csv','w');
$data= array_map("utf8_decode", $data);
fputcsv($file,$data);
试试看
谢谢,但是它已经在脚本中了,但是我简化了文章的代码部分。(本文中还提到:“我的PHP脚本在标题中也声明为utf-8”)。THX当你要打开下载的CSV文件时,请选择编码类型:UTF-8检查一下。谢谢,但是它已经在脚本中了,但是我简化了文章的代码部分。(本文中还提到:“我的PHP脚本在标题中也声明为utf-8”)。THX当您要打开下载的CSV文件时,请选择编码类型:UTF-8进行检查。“我正在删除的页面似乎是UTF-8编码的”-更确切地说,您正在删除的页面实际上已经使用这些数字实体来表示这些字符。您可能只是没有注意到,因为您在浏览器将调试输出解释为HTML后查看了它们html\u entity\u decode
应该会有帮助。@misorude,谢谢你的帮助。我真的不理解你的评论,让我补充一下:当我对我的$data
数组执行打印时,所有字符都是可用的,但问题是当我尝试对这个数组执行其他操作时,例如对JS执行json\u encode
,或者写入.csv。你明白我什么意思吗?这是一个print#r(“Szé;kes”)代码>-注意到什么了吗?是的,print\u r
returnSzékes
。接下来,我使用htmlentities
获取值的原始数字实体,但我现在的问题是:如何将值存储为Székes
而不是Szé;kes
?thx@misorude“是的,print\u r
returnSzékes
”-那么你现在明白我最初的评论了吗?“例如,如何将值存储为Székes
,而不是Szé;kes
?”—通过将您拥有的值转换为您想要的值—您当前拥有Szé;kes
。不,我并没有说要使用htmlentities
“我正在废弃的页面似乎是utf-8编码的”——它看起来更像是