[Charset]UTF-8, UTF-16, UTF-16LE, UTF-16BE的區別 - 程式人生
文章推薦指數: 80 %
如果這個UTF-16檔案裡帶有BOM的話, charset就用"UTF-16", java會自動根據BOM判斷LE還是BE, 如果你在這裡指定了"UTF-16LE"或"UTF-16BE"的話, ...
程式人生>>[Charset]UTF-8,UTF-16,UTF-16LE,UTF-16BE的區別
[Charset]UTF-8,UTF-16,UTF-16LE,UTF-16BE的區別
阿新••發佈:2019-02-03
今天遇到的麻煩事,好久沒有使用servelt類了,今天偶感,就使用了,在報錯之後在jsp中設定的編碼形式是:
然後,我有把每個頁面的編碼重新統一了,狂汗,又查到資料了。
同時也查看了一些編碼,如下:
charset裡的問題,一般我們都用unicode來作為統一編碼,但unicode也有多種表現形式 首先,我們說的unicode,其實就是utf-16,但最通用的卻是utf-8, 原因:我猜大概是英文佔的比例比較大,這樣utf-8的儲存優勢比較明顯,因為utf-16是固定16位的(雙位元組),而utf-8則是看情況而定,即可變長度,常規的128個ASCII只需要8位(單位元組),而漢字需要24位 UTF-16,UTF-16LE,UTF-16BE,及其區別BOM 同樣都是unicode,為什麼要搞3種這麼麻煩? 先說UTF-16BE(bigendian),比較好理解的,俗稱大頭 比如說char'a',ascii為 0x61,那麼它的utf-8,則為[0x61],但utf-16是16位的,所以為[0x00,0x61] 再說UTF-16LE(littleendian),俗稱小頭,這個是比較常用的 還是char'a',它的程式碼卻反過來:[0x61,0x00],據說是為了提高速度而迎合CPU的胃口,CPU就是這到倒著吃資料的,這裡面有彙編的知識,不多說 然後說UTF-16,要從程式碼裡自動判斷一個檔案到底是UTF-16LE還是BE,對於單純的英文字元來說還比較好辦,但要有特殊字元,圖形符號,漢字,法文,俄語,火星語之類的話,相信各位都很頭痛吧,所以,unicode組織引入了BOM的概念,即byteordermark,
顧名思義,就是表名這個檔案到底是LE還是BE的, 其方法就是,在UTF-16檔案的頭2個位元組裡做個標記:LE[0xFF,0xFE],BE[0xFE,0xFF] 理解了這個後,在java裡遇到utf-16還是會遇到麻煩,因為要在檔案裡面單獨判斷頭2個再位元組是很不流暢的 小結:
Java程式碼
InputStreamReader reader=new InputStreamReader(fin, charset)
1.如果這個UTF-16檔案裡帶有BOM的話,charset就用"UTF-16",java會自動根據BOM判斷LE還是BE,如果你在這裡指定了"UTF-16LE"或"UTF-16BE"的話,猜錯了會生成亂七八糟的檔案,哪怕猜對了,java也會把頭2個位元組當成文字輸出給你而不會略過去,
因為[FFFE]或[FEFF]這2個程式碼沒有內容,所以,windows會用"?"代替給你 2.如果這個UTF-16檔案裡不帶BOM的話,則charset就要用"UTF-16LE"或"UTF-16BE"來指定LE還是BE的編碼方式另外,UTF-8也有BOM的,[0xEF,0xBB,0xBF],但可有可無,但用windows的notepad另存為時會自動幫你加上這個,而很多非windows平臺的UTF8檔案又沒有這個BOM,真是難為我們這些程式設計師啊 錯誤的例子 1.檔案A,UTF16格式,帶BOMLE, InputStreamReaderreader=newInputStreamReader(fin,"utf-16le") 會多輸出一個"?"在第一個位元組,原因:java沒有把頭2位當成BOM 2.檔案A,UTF16格式,帶BOMLE, InputStreamReaderreader=newInputStreamReader(fin,"utf-16be") 會出亂碼,原因:位元組的高低位弄反了,'a'在檔案裡[0x61,0x00],但java以為'a'應該是[0x000x61] 3.檔案A,UTF16格式,帶BOMBE, InputStreamReaderreader=newInputStreamReader(fin,"utf-16le") 會出亂碼,原因:位元組的高低位弄反了,'a'在檔案裡[0x00,0x61],但java以為'a'應該是[0x610x00] 4.檔案A,UTF16格式,帶BOMBE, InputStreamReaderreader=newInputStreamReader(fin,"utf-16be") 會多輸出一個"?"在第一個位元組,原因:java沒有把頭2位當成BOM 5.檔案A,UTF16格式,LE不帶BOM, InputStreamReaderreader=newInputStreamReader(fin,"utf-16") 會出亂碼,因為utf-16對於java來說,預設為be(1.6JDK,以後的說不準) 但windows的notepad開啟正常,因為notepad預設為le,--# 6.檔案A,UTF16格式,BE不帶BOM, InputStreamReaderreader=newInputStreamReader(fin,"utf-16") 恭喜你,蒙對了 但winodws的notepad開啟時,每個字元中間都多了一個"",因為notepad把它當成ASNI了
1、一個http請求經過的幾個環節:
瀏覽器(iefirefox)【get/post】------------>Servlet伺服器------------------------------->瀏覽器顯示
編碼 解碼成unicode,然後將顯示的內容編碼 解碼
(1)瀏覽器把URL(以及post提交的內容)經過編碼後傳送給伺服器。
(2)這裡的Servlet伺服器實際上指的是由Servlet伺服器提供的servlet實現ServletRequestWrapper,不同應用伺服器的servlet實現不同,這些servlet的實現把這些內容解碼轉換為unicode,處理完畢後,然後再把結果(即網頁)編碼返回給瀏覽器。
(3)瀏覽器按照指定的編碼顯示該網頁。
當對字串進行編碼和解碼的時候都涉及到字符集,通常使用的字符集為ISO8859-1、GBK、UTF-8、UNICODE。
2、URL的組成:
域名:埠/contextPath/servletPath/pathInfo?queryString
說明:
1、ContextPath是在Servlet伺服器的配置檔案中指定的。
對於weblogic:
contextPath是在應用的weblogic.xml中配置。
request.getParameter("name"); //獲得queryString的引數值(來自於get和post),其值經過Servlet伺服器URLDecode過的
request.getPathInfo(); //注意:pathinfo返回的字串是經過Servlet伺服器URLDecode過的。
requestURI=request.getRequestURI();//內容為:contextPath/servletPath/pathinfo瀏覽器提交過來的原始資料,未被Servlet伺服器URLDecode過。
3、開發人員必須清楚的servlet規範:
(1)HttpServletRequest.setCharacterEncoding()方法僅僅只適用於設定post提交的requestbody的編碼而不是設定get方法提交的queryString的編碼。
該方法告訴應用伺服器應該採用什麼編碼解析post傳過來的內容。
很多文章並沒有說明這一點。
(2)HttpServletRequest.getPathInfo()返回的結果是由Servlet伺服器解碼(decode)過的。
(3)HttpServletRequest.getRequestURI()返回的字串沒有被Servlet伺服器decoded過。
(4)POST提交的資料是作為requestbody的一部分。
(5)網頁的Http頭中ContentType("text/html;charset=GBK")的作用:
(a)告訴瀏覽器網頁中資料是什麼編碼;
(b)表單提交時,通常瀏覽器會根據ContentType指定的charset對錶單中的資料編碼,然後傳送給伺服器的。
這裡需要注意的是:這裡所說的ContentType是指http頭的ContentType,而不是在網頁中meta中的ContentType。
c++檔案讀寫詳解
«上一篇
flume1.6.0原始碼編譯下一篇»
相關推薦
JAVA編碼中文問題系統透徹講解UNICODEGBKUTF-8ISO-8859-1之間的區別
宣告
目錄
步驟1:編碼概念
步驟2:常見編碼
步驟3:UNICODE和UTF
步驟4:...
python3寫中文報錯SyntaxError:Non-UTF-8code,編碼宣告的區別
python預設是使用 ascii編碼的,直接print("中文")是會報錯的:
例如:
print("你好")
報...
UTF-8GBKUTF8GB2312之間的區別和關係
UTF-8:UnicodeTransformationFormat-8bit,允許含BOM,但通常不含BOM。
是用以解決...
utf-8unicode各種編碼的區別與聯絡
1.編碼的大概認識
以UTF8格式儲存的檔案檔首標識為EFBBBF。
效率 從上述編碼原理中得出的結論是: 1).每個...
java亂碼詳解_jsp中pageEncoding、charset=UTF-8"、request.setCharacterEncoding("UTF-8")
可以簡單認為是,pageEncoding是jsp檔案本身的編碼;contentType的charset是指伺服器傳送給客戶端時的內容...
VS無簽名UTF-8和帶簽名UTF-8格式
在VS中,使用高階儲存選項功能的時候,我們會發現UTF8有兩種格式,一個是帶簽名的UTF8,一個是無簽名的UTF8。
那麼這兩種的格式有什麼區別呢?
...
Python2.7中文字元編碼&Pycharmutf-8設定、Unicode與utf-8的區別
Python2.7中文字元編碼&Pycharmutf-8設定、Unicode與utf-8的區別
[email protected]
...
vs2015:/utf-8選項解決UTF-8withoutBOM原始碼中文輸出亂碼問題
本來我已經參考網上關於C++中文輸出亂碼的文章解決了,如下面的程式碼輸出前呼叫wcout.imbue設定loca...
關於utf-8,utf-7,unicode幾種編碼的區別
今天上csdn論壇時看到一個關於utf-8,utf-7......幾種編碼的區別,說法不一,雖然經常使用這幾種編碼,咋一想,還...
utf-8轉gb2312,gb2312轉utf-8
這兩種程式碼格式之間的轉換網上有很多的文章,都寫的很詳細,
但是從網上找相關的工具,發現不是很好用,舉個例子,沒有辦法選擇檔...
搜尋
基礎教學
Mysql入門
Sql入門
Android入門
Docker入門
Go語言入門
Ruby程式入門
Python入門
Python進階
Django入門
Python爬蟲入門
最近訪問
[Charset]UTF-8,+UTF-16,+UTF-16LE,+UTF-16BE的區別
什麼是SLA服務品質保障協議?
Python爬蟲入門+|+2++爬取豆瓣電影資訊
MySQL+Connection使用Hack方法回到沒有預設資料庫的狀態
Oracle數據庫基本操作——表空間管理
抽象類沒抽象方法的例子
ASP.NET常見面試題及答案(130題)
webservice中使用log4j記錄日誌
【c語言】水仙花數
AWS+Lambda合作伙伴_AWS+Lambda無伺服器計算服務
延伸文章資訊
- 1位元組順序記號 - 维基百科
位元組順序記號(英語:byte-order mark,BOM)是位於碼點 U+FEFF 的統一碼字符的名称。當以UTF-16或UTF-32來將UCS/統一碼字符所組成的字串編碼時,這個字符被用來...
- 2UTF-16 - 字嗨!
因為處理UTF-16兩種編碼序列時如果搞錯,會得到完全不同的結果,所以UTF-16純文字文件習慣在前面加上U+FEFF 字元作為BOM(Byte Order Mark;位元組順序標註)。
- 3這些是什麼? BOM/UFT-8有簽章/withBOM/withoutBOM - iT 邦幫忙
Windows 作業系統不少程式(像是記事本),預設會對UTF-8 檔案加上BOM 而Linux 則避免妨礙到像是解譯 ... 它常被用來當做標示檔案是以UTF-8、UTF-16或UTF-32編...
- 4BOM — Unicode歷史沙石(之一) - I.T. 9 遊戲日誌
如果以2個byte嘅Little Endian編碼方式去將Unicode文字去編碼的話,呢種方法就叫UTF-16LE。如果用咗Big Endian就叫UTF-16BE。當然,現實上中其實仲有第三...
- 5How do I encode/decode UTF-16LE byte arrays with a BOM?
The "UTF-16" charset name will always encode with a BOM and will decode data using either big/lit...