文件編碼問題:20161201php
這個問題是在開發中遇到的一個簡單的小問題,本身也是第一次遇到。剛開始內心是很模糊的,徹底沒有什麼解決的方案。起初,我覺得是不一樣的系統之間打開統一格式的文件會使用不一樣的編碼,因此,致使的亂碼顯示問題。不過,都是.txt的文本文件,在不一樣的文本軟件下打開倒是不一樣的效果。好比在WINDOWS系統中打開是默認使用的ANSI編碼打開,因此,不會出現任何編碼問題。正常顯示的,可是,當咱們把這個文本文件發送到UNIX系統,Mac系統下使用的時候,使用文本文件打開也是沒有問題有題的,但,當咱們使用sumlime軟件打開的時候,出現了亂碼的問題。函數
科普一下:工具
ANSI編碼通常指Windows-1252編碼,是一個256個字符的字集的編碼,每一個字符由一個字節表示。其中前128個字符(00-7F)和ASCII的7bits編碼同樣,後128個字符中有一些歐洲國家用的有重音的字符。ANSI編碼在不一樣語言的Windows下也指此語言下的Windows編碼頁,好比中文環境下指Windows-936(也就是GB2312),日文環境下是Windows-932(JIS)編碼等等,也是前128個字符(00-7F)和ASCII的7bits編碼同樣,其餘字符則由2個字節表示。編碼
UTF-8是針對Unicode的可變長度字符編碼,一個字符能夠由1到4個字節表示,其中由一個字節表示的字符和ASCII的7bits編碼同樣,而包括中文在內的大部分字符則由3個字節表示。spa
因此若是文本里只有ASCII的7bits編碼的那些,這兩種編碼是互相兼容沒有區別的,可是對其餘字符,編碼就不一樣了,並且Windows-1252編碼沒法表達除了256個字符外的好比中文字符,其餘的ANSI編碼如Windows-936也只能表示一部分Unicode中的字符。編碼格式的不一樣致使程序沒法運行很容易理解,由於一樣的字集在不一樣的編碼方式下表達的字符是不一樣的或者是不能被表示的,除非是ASCII的7bits編碼中的那些字符。code
解決辦法:blog
爲了可以在Mac系統下正常打開文件,把這個文件在Windows下使用記事本打開,而後選擇「另存爲」 -》 選擇「編碼」 -》「utf-8」。保存好以後再發送到Mac系統下,如今就可以正常顯示啦。不過,我遇到的問題是:文件是使用程序生成的,默認的編碼是ANSI編碼,咱們想要使用的編碼是utf-8編碼。因此,在程序生成文件的時候,再使用程序把文件的編碼方式轉換爲utf-8,這樣就可以在各個平臺正常的顯示啦。utf-8
這裏的編碼轉換程序,以前是在網上搜索到一個大牛寫的一個工具類,能夠實現各類編碼之間的相互轉換。不過,個人需求就只是把ansi編碼轉換成爲utf8編碼。因此,我就抽取了我須要的部分加入了個人程序中。開發
$str = iconv('GBK', 'UTF-8//IGNORE', $str);
以上是php代碼,就是這一個簡單的代碼就能夠實現個人需求了。實現思路就是把文件的內容一次性讀入到字符串中,而後,轉換爲utf-8編碼,再寫入到文件中便可。字符串
國際化字符與編碼支持
iconv 函數
iconv_get_encoding — 獲取 iconv 擴展的內部配置變量
iconv_mime_decode_headers — 一次性解碼多個 MIME 頭字段
iconv_mime_decode — 解碼一個MIME頭字段
iconv_mime_encode — Composes a MIME header field
iconv_set_encoding — 爲字符編碼轉換設定當前設置
iconv_strlen — 返回字符串的字符數統計
iconv_strpos — Finds position of first occurrence of a needle within a haystack
iconv_strrpos — Finds the last occurrence of a needle within a haystack
iconv_substr — 截取字符串的部分
iconv — 字符串按要求的字符編碼來轉換ob_iconv_handler — 以輸出緩衝處理程序轉換字符編碼