Php folder-file 创建编码问题
Php folder-file creation encoding issues
我在使用 cakephp 3 的 Folder and File libraries 创建文件和文件夹时遇到问题(虽然它在后端是 php 的 mkdir)。
PHP版本为7.0.28
步骤:
- 用户上传文件(希腊字符)
- 系统处理一些不相关的验证等
- 系统创建路径以将文件保存在自定义文件夹中并将位置保存在数据库中 table 如下所示:
documents. DS . $user->username . DS . $file->protocol . $file->file_type . DS . $file->name
示例路径看起来像
/documents/user/Κ.300/Κ.310_6_4092.pdf
- 在我的 ubuntu 环境中,它工作正常,但是在 windows 服务器 2012 R2 上,希腊字符部分看起来有编码问题,就像这样(对质量不好表示歉意)
我已经尝试了很多事情,这是我目前所知道的:
- Ubuntu 16.04 使用与 php 相同的 UTF-8 编码,这就是该文件夹在我的开发环境中看起来不错的原因。
- Windows 使用 UTF-16(我相信,我不是 100% 确定)这是我应该将其转换为的格式,但是当我尝试将路径转换为 utf-16 时,我得到了以下 iconv 错误或希腊字符显示为问号并且 php 无法创建目录:
illegal input sequence at position
这是
底层代码:
public function setPath(array $data)
{
Configure::load('file_directories', 'default');
$path = $this->createPathFromData($data);
$folder = new Folder('/');
$folder->create($path);
$this->directory = new Folder($path);
if (!$this->validateDirectory()) {
throw new Exception('Something went wrong when creating directories');
}
}
以下是一些调试输出:
debug(mb_detect_encoding($path));
UTF-8
debug($path);
debug(iconv('UTF-8', 'UTF-16', $path));
'/inbox/documents/someUser/εξερχομενο/Κ.900'
'��/inbox/documents/someUser/����������/�.900'
debug(iconv('UTF-8', 'GREEK', $path));
'inbox/documents/someUser/���������/�.900'
debug(iconv('UTF-8', 'Windows-1252', $path));
[https://secure.php.net/function.iconv'>function.iconv]: Detected an illegal character in input string
当我输入任何一个转换后的编码路径到 $folder->create($path)
时,如果我得到任何路径,我仍然得到虚假路径。
如何为 windows Server 2012 xampp 创建正确的文件和文件路径?
更新
经过几个小时的测试,在我的 windows 服务器中,我通过表单发送的希腊字符数据显示不正确,因为 windows 通过 Windows-1251编码。
在 phpmyadmin 中,它们都显示正确,但如果我在我的系统 运行 中间放置一个断点,它们看起来与我显示的屏幕截图类似。此外,我的回复 headers 的 character-set 是 Windows-1251
for windows,utf-8
for ubuntu。所以我尝试将我的 utf-8 数据转换为 windows-1252 但我的希腊语输入仍然变成了问号。仍然没有解决方案
对于那些和我有同样问题的人,主要是希腊开发者,这里是根据用户输入创建具有希腊名称的文件夹和文件的答案:
- 将系统区域设置更改为希腊语(或您想要的语言),如 so
当您通过表单获取输入时(假设输入编码为 UTF-8),将其转换为 ISO-8859-1 或 Windows-1253。如果你把它转换成Windows-1253你只能使用php的函数iconv。对于 ISO-8859-1,您可以使用 mb_convert_econding。像这样:
$input = iconv('UTF-8', 'Windows-1253', $input)
或
$input = mb_convert_encoding($input, 'ISO-8859-1')
现在您可以创建希腊语文件夹了。请记住 Windows-1252 或 Windows-1251 不 支持希腊字符,而 Windows-1253 只有在您更改系统语言环境也改为希腊语。
你还没有完成! 根据你的数据库编码(在我的例子中是 UTF-8)你 有 将字符串转换回 UTF-8(如果您打算存储它)。或者你可以在一开始就复印一份。无论如何,不要将转换后的输入存储在您的数据库中,否则您最终会得到一堆存储的乱码。
我希望这能为别人省去我必须经历的麻烦!
我在使用 cakephp 3 的 Folder and File libraries 创建文件和文件夹时遇到问题(虽然它在后端是 php 的 mkdir)。
PHP版本为7.0.28
步骤:
- 用户上传文件(希腊字符)
- 系统处理一些不相关的验证等
- 系统创建路径以将文件保存在自定义文件夹中并将位置保存在数据库中 table 如下所示:
documents. DS . $user->username . DS . $file->protocol . $file->file_type . DS . $file->name
示例路径看起来像
/documents/user/Κ.300/Κ.310_6_4092.pdf
- 在我的 ubuntu 环境中,它工作正常,但是在 windows 服务器 2012 R2 上,希腊字符部分看起来有编码问题,就像这样(对质量不好表示歉意)
我已经尝试了很多事情,这是我目前所知道的:
- Ubuntu 16.04 使用与 php 相同的 UTF-8 编码,这就是该文件夹在我的开发环境中看起来不错的原因。
- Windows 使用 UTF-16(我相信,我不是 100% 确定)这是我应该将其转换为的格式,但是当我尝试将路径转换为 utf-16 时,我得到了以下 iconv 错误或希腊字符显示为问号并且 php 无法创建目录:
illegal input sequence at position
这是 底层代码:
public function setPath(array $data)
{
Configure::load('file_directories', 'default');
$path = $this->createPathFromData($data);
$folder = new Folder('/');
$folder->create($path);
$this->directory = new Folder($path);
if (!$this->validateDirectory()) {
throw new Exception('Something went wrong when creating directories');
}
}
以下是一些调试输出:
debug(mb_detect_encoding($path));
UTF-8
debug($path);
debug(iconv('UTF-8', 'UTF-16', $path));
'/inbox/documents/someUser/εξερχομενο/Κ.900'
'��/inbox/documents/someUser/����������/�.900'
debug(iconv('UTF-8', 'GREEK', $path));
'inbox/documents/someUser/���������/�.900'
debug(iconv('UTF-8', 'Windows-1252', $path));
[https://secure.php.net/function.iconv'>function.iconv]: Detected an illegal character in input string
当我输入任何一个转换后的编码路径到 $folder->create($path)
时,如果我得到任何路径,我仍然得到虚假路径。
如何为 windows Server 2012 xampp 创建正确的文件和文件路径?
更新
经过几个小时的测试,在我的 windows 服务器中,我通过表单发送的希腊字符数据显示不正确,因为 windows 通过 Windows-1251编码。
在 phpmyadmin 中,它们都显示正确,但如果我在我的系统 运行 中间放置一个断点,它们看起来与我显示的屏幕截图类似。此外,我的回复 headers 的 character-set 是 Windows-1251
for windows,utf-8
for ubuntu。所以我尝试将我的 utf-8 数据转换为 windows-1252 但我的希腊语输入仍然变成了问号。仍然没有解决方案
对于那些和我有同样问题的人,主要是希腊开发者,这里是根据用户输入创建具有希腊名称的文件夹和文件的答案:
- 将系统区域设置更改为希腊语(或您想要的语言),如 so
当您通过表单获取输入时(假设输入编码为 UTF-8),将其转换为 ISO-8859-1 或 Windows-1253。如果你把它转换成Windows-1253你只能使用php的函数iconv。对于 ISO-8859-1,您可以使用 mb_convert_econding。像这样:
$input = iconv('UTF-8', 'Windows-1253', $input)
或
$input = mb_convert_encoding($input, 'ISO-8859-1')
现在您可以创建希腊语文件夹了。请记住 Windows-1252 或 Windows-1251 不 支持希腊字符,而 Windows-1253 只有在您更改系统语言环境也改为希腊语。
你还没有完成! 根据你的数据库编码(在我的例子中是 UTF-8)你 有 将字符串转换回 UTF-8(如果您打算存储它)。或者你可以在一开始就复印一份。无论如何,不要将转换后的输入存储在您的数据库中,否则您最终会得到一堆存储的乱码。
我希望这能为别人省去我必须经历的麻烦!