因为编码问题打搅大家真是不好意思。
环境:
Windows10
Apache/2.4.18 (Win32)
Laravel 5.1
PHP/7.0.0
5.7.10-log - MySQL Community Server (GPL)
服务器字符集: UTF-8 Unicode (utf8)
我的数据库和表是 UTF8 编码,
我的代码也使用 UTF8 编码
代码使用了 Laravel 作为框架,在 Laravel 的框架中,
……\vendor\laravel\framework\src\Illuminate\Database\Connection.php
使用了这么一段代码
如图中红色圈处所示,我加了一个 var_dump()来显示即将存储的数据,打印得到的是
_
出问题的地方就在图中的那段 地址 处,此时地址为 D:\MusicBase\xxx 纯中文的歌曲 1.mp3 。
在执行完以后,数据库中出现的情况是这样子的
如果将文件名字全部改为中文, 如 D:\MusicBase\纯中文的歌曲 1.mp3 ,则变为
感觉像是字符串中 从中文开始以后全部被截断。
自己在搜索引擎中搜索之后,有人提示在执行 insert 之前先执行 “ set names utf8 ”,我照做之后没有任何改变。
我突发奇想,将该命令改为 “ set names gbk ”,结果却成功存入数据库,如图
这到底是为什么?
1
msg7086 2015-12-16 01:29:12 +08:00 2
检查你的输入源。
如果你 var_dump 打印出来是在 Windows 的 CMD 下,那说明数据是 GBK 的。 (和你源码的字符集是无关的。 |
2
baozijianke OP @msg7086 终端我使用的是 Windows 下的 MINGW64 。
输入源 是使用的 Symfony 框架的 Finder 组件,获得文件和目录地址。 您提醒我了,我这样做了个实验:同样输出一段地址,分别在 MINGW64 和浏览器上执行。 在 MINGW64 上 ![]( ) 在浏览器上 ![]( ) 浏览器是默认是 UTF-8 编码,在改为 GBK 编码后也能正常显示,这样证明了确实是我的输入源本身就是 GBK 编码。 非常感谢!!! 另外,因为我是使用 Symfony 框架的 Finder 组件,输入源是 GBK 编码的原因是该框架的原因还是 Windows 本身的原因? 还是需要具体看代码才能分析? |
3
msg7086 2015-12-16 02:00:15 +08:00
Finder 是啥?
你这个是读取本地文件的名字吗? Windows 下都是本地编码吧, Linux 下才是 UTF-8 。 (所以如果你程序准备在 Linux 下跑的,千万别在 Windows 下调测。 |
4
baozijianke OP @msg7086 嗯,这几天恶补了下编码和字符等知识,确认了,这就是编码的问题。诶,还是走 Linux 吧,不考虑 win 平台了。太坑了。
|