2016-05-13 132 views
0

上传日文名称的文件时,有些字符会产生问题。 在Windows系统上,我想保存上传的文件名称。所以我必须使用 mb_convert_encoding($name, "SJIS", "AUTO"); ,它适用于大多数情况。PHP上传的文件名:日文字符编码

虽然像0423図表①这样的等字符在最后完全消失。看来,在上传时的文件名已经是“错误”: 它看起来像"0423å³è¡¨â .pptx"UTF-8,如果我改变标题的字符集与

header('Content-Type: text/html; charset=SJIS'); 

它看起来像

"0423テ・ツ崢ウティツ。ツィテ「ツ堕.pptx" 

我不知道在这种情况下我能做什么。我试图替换字符,但在编码转换之前或之后,我甚至找不到strpos()

+0

谢谢。很高兴你把事情解决了。哪一位解决了你的问题,是'mb_stripos'函数找到了正确的字符? – Martin

回答

1

要符合我的答案(到downvoter):

问:我听说UTF-8不支持某些日文字符。它是否正确?

答:关于中文,日文和韩文(CJK)字符的支持 有很多错误信息。 Unicode标准 支持例如来自JIS X 0208,JIS X 0212,JIS X 0221或JIS X 0213的所有CJK字符等等。这是真实的否 使用Unicode的编码形式:UTF-8,UTF-16或 UTF-32。

Unicode现在支持超过80,000个CJK字符,并且正在编写的工作是 以编码进一步的添加。国际标准 ISO/IEC 10646和Unicode标准完全同步于 所有曲目和内容。这意味着Unicode与GB 18030具有相同的 所有组合,因为它也与ISO 10646 同步 - 尽管采用不同的排序和字节格式。

来自:The Unicode Consortium

我的回答:

不是strpos使用mb_stripos,从PHP Multibyte string functions来查找和替换的字符。这应该可以帮助脚本检测并翻译非拉丁字符。

如果上传的文件名($_FILES['var']['name'])是在PHP脚本已经不正确(从输出如print_r($_FILES)),那么你需要确保你正确使用accept-charset='UTF-8'(或SJIS等)编码的HTML表单。我希望你已经在这方面领先于我。

此外,它可能是明智的,在你的代码的顶部添加一些preconditionals,再次使用PHP mb_功能添加在你的PHP页面的顶部:

mb_internal_encoding('UTF-8'); //or whatever character set works for you 
mb_http_output('SJIS'); 
mb_http_input('UTF-8'); 
mb_regex_encoding('UTF-8'); 

出于兴趣:

http://www.unicode.org/reports/tr37/

http://david.latapie.name/blog/shift-jis-utf-8/