在使用file_get_contents函数读取文件时出现乱码通常是因为文件编码不匹配导致的。解决方法有以下几种:
指定文件编码:可以使用第三个参数$context来指定文件编码,例如:
$file_contents = file_get_contents('file.txt', false, stream_context_create([
'http' => [
'header' => 'Content-Type: text/plain; charset=utf-8'
]
]));
复制代码
使用iconv函数转换编码:可以使用iconv函数将文件内容转换为指定编码,例如:
$file_contents = file_get_contents('file.txt');
$file_contents = iconv('gbk', 'utf-8', $file_contents);
复制代码
修改文件编码:可以通过文本编辑器修改文件的编码为UTF-8,以确保文件编码与读取时的编码一致。
通过以上方法应该可以解决使用file_get_contents读取文件出现乱码的问题。
`https://cloud.tencent.com/developer/article/1480645`
最近拉取了京东结算订单csv文件,结果发现在用file_get_contents获取内容的时候,中文出现了乱码,感觉京东这么大,这个技术问题他们帮忙解决才好吧,想想还是算了,自己动动手的问题。
大概我也能猜到,京东的系统默认应该都不是utf-8的编码,大多数还是gbk或者是gb2312,因为之前使用过类似的国内产品,可能是由于历史原因,这个不深究了,
```
$content = '';
$text = file_get_contents($file);
//$encodType = mb_detect_encoding($text);
define('UTF32_BIG_ENDIAN_BOM', chr(0x00) . chr(0x00) . chr(0xFE) . chr(0xFF));
define('UTF32_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE) . chr(0x00) . chr(0x00));
define('UTF16_BIG_ENDIAN_BOM', chr(0xFE) . chr(0xFF));
define('UTF16_LITTLE_ENDIAN_BOM', chr(0xFF) . chr(0xFE));
define('UTF8_BOM', chr(0xEF) . chr(0xBB) . chr(0xBF));
$first2 = substr($text, 0, 2);
$first3 = substr($text, 0, 3);
$first4 = substr($text, 0, 3);
$encodType = "";
if (UTF8_BOM == $first3) {
$encodType = 'UTF-8 BOM';
} else if (UTF32_BIG_ENDIAN_BOM == $first4) {
$encodType = 'UTF-32BE';
} else if (UTF32_LITTLE_ENDIAN_BOM == $first4) {
$encodType = 'UTF-32LE';
} else if (UTF16_BIG_ENDIAN_BOM == $first2) {
$encodType = 'UTF-16BE';
} else if (UTF16_LITTLE_ENDIAN_BOM == $first2) {
$encodType = 'UTF-16LE';
}
//下面的判断主要还是判断ANSI编码的·
if ('' == $encodType) {
//即默认创建的txt文本-ANSI编码的
$content = iconv("GBK", "UTF-8", $text);
} else if ('UTF-8 BOM' == $encodType) {
//本来就是UTF-8不用转换
$content = $text;
} else {
//其他的格式都转化为UTF-8就可以了
$content = iconv($encodType, "UTF-8", $text);
}
```