成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你了解Java中的幾種編碼方式?解決亂碼問題可能并不麻煩

開發 后端
碼的轉換通常在IO機制中使用,一個好的編碼可以為我們節省很多空間,在某種程度上提高我們應用的效率。

 [[373184]]

前言

編碼的轉換通常在IO機制中使用,一個好的編碼可以為我們節省很多空間,在某種程度上提高我們應用的效率。由于之前就知道String中的轉換方式,還有一些工具類,因此今天就好好的整理一下java中jdk提供的幾種轉換方式,希望對你有幫助。

一、編碼轉換原理

1、為什么需要編碼

我們知道計算機存儲信息的最小單位是一個字節8位,能夠表示256個字符。這對于早起的英文來說足夠了。即使是加上一些常見符號也足夠。于是在1965年美國制定了ASCII編碼,主要用于英語和西歐語言,一開始128個,后來加到了256。

后來隨著時間的發展,中國、日本等國的計算機也開始蓬勃發展,于是計算機不僅僅要存儲英文了,也開始存儲中文。但是中文我們都知道幾萬個太多了,一個字節肯定放不下。怎么辦呢?一個字節表示不下,那就多用幾個字節就好了。這樣不僅可以表示漢字,還可以避免了與ASCII編碼的沖突。這幾個字節在存儲的時候再轉化為bit,完美!劃重點哈,編碼解決的就是字節和字符之間的轉化問題。

2、編碼方式

既然是編碼,那些大佬早就考慮到了這些問題,并提拱了多種編碼方式,常見的有 ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16 等。它們規定了轉化的規則,按照這個規則就可以讓計算機正確的表示我們的字符。

像GB2312、GBK、UTF-8、UTF-16等很多種方式都可以表示漢字,他們有什么區別呢?

(1)GB2312

它是雙字節編碼,總的編碼范圍是 A1-F7,其中從 A1-A9 是符號區,總共包含 682 個符號,從 B0-F7 是漢字區,包含 6763 個漢字。這個是中國1981年搞出來的。這種編碼是一個漢字兩個字節。

(2)GBK

它的編碼范圍是 8140~FEFE(去掉 XX7F)總共有 23940 個碼位,它能表示 21003 個漢字。這個是中國在1995年搞出來的,主要是用于GB2312編碼的補充。這種編碼依然是一個漢字兩個字節。

(3)Unicode

上面看到,中國可以做出了一個編碼,日本也可以做出來一個編碼,時間久了每個國家都有著自己的一套編碼,就不可避免的造成沖突。于是Unicode出來了,把所有語言統一起來合成一個規則。這種編碼是定長的字節數。

(4)UTF8

既然Unicode是定長的字節數,那么存儲一個復雜的漢字可能需要三個字節,但是為了保證是2的冪數集,就會自動擴充為4個字節,別看著一個字節之差,存儲的字數多了就會極大的浪費空間。是于是而 UTF-8 采用了一種變長技術,每個編碼區域有不同的字碼長度。不同類型的字符可以是由 1~6 個字節組成。

以上這些編碼方式會為每一個漢字或者是字母建立一個編碼庫,在編碼的時候字母和編碼一一對應。

3、為什么會出現亂碼?

這個問題就是因為編碼和解碼是采用了不同的或者是不兼容的編碼方案。比如一個用UTF-8編碼的后的字符。再用GBK去解碼,由于兩個字符集的編碼庫不一樣。同一個漢字在兩個編碼庫的位置也不一樣。于是就出現了亂碼。

4、java如何解決亂碼問題?

這個問題其實就是java中如何使用編碼規則,因為使用好了編碼規則。才可以很好地解決亂碼問題。

(1)IO流

編碼的目的上面已經說了,主要是字節和字符之間的轉化。既然涉及到字節和字符很容易我們就能想到java中的IO流。也就是說java中編碼的轉換其實就是IO流中的類來實現的。

最核心的就是上面幾個類,當然這里只是給出了輸入的一部分,還有一些輸出的類。

(2)String

String類中也提供了一些轉碼的方法。下面我們會通過實例來說明。為什么String可以實現呢?這是因為String底層保存的其實就是一個一個字節,而且String還有方法直接轉化為字符。所以String肯定也能實現。

(3)Charset

這個Charset是javaNIO中的一個類,整個流程就是讀取數據,然后轉化為byte,也就是字符。然后重新編碼成字符就OK了。

下面我們使用代碼來實現一下:

二、代碼實現

1、IO流

首先是IO流實現,這種通過輸入輸出流可以直接的指定編碼規則。

  1. public void convertionFile() throws IOException { 
  2.  File file = new File("./愚公要移山.txt"); 
  3.  FileInputStream fis = new FileInputStream(file); 
  4.  InputStreamReader inReader = new InputStreamReader(fis, "gbk"); 
  5.  FileOutputStream fos = new FileOutputStream(file); 
  6.  OutputStreamWriter outReader = new OutputStreamWriter(fos, "utf-8"); 
  7.        //這種輸入gbk,輸出utf-8肯定會出現錯誤 

2、String

使用string是最方便的,代碼也比較簡潔,適用于字符串的編碼。

  1. public void convertionString() throws UnsupportedEncodingException { 
  2.   String s = "愚公要移山,碼農飛上天"
  3.   // 正常情況下轉碼的過程 
  4.   byte[] b = s.getBytes("gbk");// 編碼 
  5.   String sa = new String(b, "gbk");// 解碼 
  6.   System.out.println(sa); 
  7.   // 錯誤狀態下轉碼的過程 
  8.   b = sa.getBytes("utf-8");// 編碼使用utf-8 
  9.   sa = new String(b, "gbk");// 解碼使用gbk 
  10.   System.err.println(sa); 
  11. //控制臺輸出: 
  12. //愚公要移山,碼農飛上天 
  13. //鎰氬叕瑕佺Щ灞憋紝鐮佸啘椋炰笂澶? 

3、Charset

  1. public void convertionCharset() throws IOException { 
  2.   Charset charset = StandardCharsets.UTF_8; 
  3.   // 從字符集中創建相應的編碼和解碼器 
  4.   CharsetEncoder encoder = charset.newEncoder(); 
  5.   CharsetDecoder decoder = charset.newDecoder(); 
  6.   // 構造一個buffer 
  7.   CharBuffer charBuffer = CharBuffer.allocate(64); 
  8.   charBuffer.put('A'); 
  9.   charBuffer.flip(); 
  10.   // 將字符序列轉換成字節序列 
  11.   ByteBuffer bb = encoder.encode(charBuffer); 
  12.   // 將字節序列轉換成字符序列 
  13.   bb.flip(); 
  14.   CharBuffer cb = decoder.decode(bb); 

以上就是三種基本的實現方式,當然還有一些其他的,比如Spring中提供的編碼轉換工具等等。在這里就不說了,因為技術太多,實現的方式也太多,我們就看這幾種即可。

本文轉載自微信公眾號「愚公要移山」,可以通過以下二維碼關注。轉載本文請聯系愚公要移山公眾號。

 

責任編輯:武曉燕 來源: 愚公要移山
相關推薦

2009-12-02 10:01:04

PHP亂碼問題

2010-05-25 11:33:27

MySQL亂碼

2020-12-09 09:30:57

前端開發技術

2021-05-07 16:19:36

異步編程Java線程

2010-05-25 14:17:17

MySQL Pytho

2022-05-27 06:57:50

Python循環方式生成器

2025-05-12 07:43:14

SpringMVC設計模式代碼

2020-09-23 07:47:14

Java方式類型

2022-08-29 10:01:59

Vue驗證機制

2015-09-21 09:52:57

邏輯推理

2009-06-19 11:16:14

java web中文亂碼

2010-05-07 10:06:10

Oracle PL D

2021-08-05 07:28:25

Java實現方式

2024-06-13 11:43:39

2017-11-06 16:06:05

大數據Hadoop打開方式

2025-04-03 07:00:00

網絡安全物聯網安全智能安全

2020-10-13 06:56:19

JavaScript異常類型開發

2019-12-26 09:13:00

算法硬件軟件

2010-06-21 13:35:50

JavaJava EE亂碼

2020-09-28 14:24:09

字典Dictionary遍歷
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产一区二区 | 国外激情av | 亚洲欧美男人天堂 | 91最新在线视频 | 国产精品1区2区3区 欧美 中文字幕 | 国产乱码精品一区二区三区中文 | 国产精品久久久久久久久图文区 | 一区二区免费在线观看 | 91精品国产91久久久久福利 | 成人免费一区二区三区牛牛 | 日韩精品一区二区三区视频播放 | 亚洲啪啪| 午夜视频一区 | 欧美精品一区二区三区在线播放 | 色姑娘av | 国产特一级黄色片 | 国产传媒视频在线观看 | 丁香婷婷成人 | 精品综合 | 日本久久综合网 | 黄色一级片视频 | 欧美日韩亚洲一区 | 久久久91精品国产一区二区三区 | 一区二区三区欧美 | 情侣av | 日韩国产免费观看 | 免费黄色的视频 | 尤物在线精品视频 | 中文字幕在线一区二区三区 | 午夜婷婷激情 | 午夜爽爽爽男女免费观看影院 | 精品无码久久久久久国产 | 伊人久久一区二区 | 亚洲一区二区中文字幕在线观看 | 日韩精品一区二区三区在线播放 | 日本一区二区在线视频 | 色视频网站 | 国产传媒视频在线观看 | 日韩不卡在线 | 一区影院 | 美国av毛片|