PHP - Upload utf-8 filename
I'm on Windows 8 chinese version, and I deal with similar problem with this:
$filename = iconv("utf-8", "cp936", $filename);
cp
stands for Code page
and cp936
stands for Code page 936, which is the default code page of simplified chinese version of Windows.
So I think maybe your problem could be solved in a similar way:
$fn2 = iconv("UTF-8","cp1258", $base_dir.$fn);
I'm not quite sure whether the default code page of your OS is 1258
or not, you should check it yourself by opening command prompt and type in command chcp
. Then change 1258
to whatever the command give you.
UPDATE
It seems that PHP filesystem functions can only handle characters that are in system codepage, according to this answer. So you have 2 choices here:
Limit the characters in the filename to system codepage - in your case, it's
437
. But I'm pretty sure that code page 437 does not include all the vietnamese characters.Change your system codepage to the vietnamese one:
1258
and convert the filename tocp1258
. Then the filesystem functions should work.
Both choices are deficient:
Choice 1: You can't use vietnamese characters anymore, which is not what you want.
Choice 2: You have to change system code page, and filename characters are limited to code page 1258.
UPDATE
How to change system code page:
Go to Control Panel
> Region
> Administrative
> Change system locale
and select Vietnamese(Vietnam)
in the drop down menu.
This meta
has no effect:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
because the web server has already sent Content-Type
header, and thus decided what the encoding will be. Web browsers send forms in the same encoding. The meta
is useful when user is off-line.
So you have to sned http header Content-Type
by yourself:
<?php header("Content-Type: text/html; charset=utf-8"); ?>
ensure that you put this before any html, content or whatever is sent.
Alternatively, accept-charset
tag on form
should work as weel:
<form accept-charset="utf-8">
I am Persian and I have same problem with utf-8 character in my language. I could solve my problem with this code:
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','windows-1256', str_replace('ی', 'ي', $fn));
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );
I am not sure about vientam language but maybe you can use the same code as above with a few changes:
$fn = $_FILES["upload"]["name"]; // name of file have some utf-8 characters
$name=iconv('utf-8','cp936', $fn);
move_uploaded_file($_FILES["upload"]["tmp_name"],$name );