2016-05-13 58 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/