用java String類的getBytes(String charsetName)和String(byte[] bytes, String charsetName)解決亂碼問題

来源:http://www.cnblogs.com/Seachal/archive/2016/08/13/5769177.html
-Advertisement-
Play Games

Java中String的數據是如何存儲的,查看源代碼就可以知道,String的數據是存儲在char[] value這樣一個成員變數中的,char類型的大小在java中是2個位元組 我們還知道,現在普遍使用的unicode版本是UCS-2,就是使用2個位元組表示一個字元的unicode版本,這就對上了,j ...


Java中String的數據是如何存儲的,查看源代碼就可以知道,String的數據是存儲在char[] value這樣一個成員變數中的,char類型的大小在java中是2個位元組 
我們還知道,現在普遍使用的unicode版本是UCS-2,就是使用2個位元組表示一個字元的unicode版本,這就對上了,java使用的就是UCS-2標準,所以,String中的value中存儲的都是一個個數字

比如’你’的unicode編碼是4f60,看下麵的測試代碼

char c = '你';
System.out.println(Integer.toHexString(c));
System.out.println(Integer.valueOf(c));
System.out.println(c);

結果是: 
4f60 
20320 

所以呢,現在我們知道了String內部其實存儲的是未經任何編碼的unicode編碼,就是那個對應字元的編碼,然後再看我們這兩個方法:

getBytes(charsetname) 
意思是根據這個編碼來獲取位元組數組 
這又是什麼意思呢? 
就是說將記憶體中的unicode編碼轉換為charsetname格式所對應的位元組數組 
比如’你’,轉換為utf-8是三個字接,所以得到的位元組數組就是三個位元組的 
即[e4 bd a0]

然後String(bytes,charsetname)呢

意思就是將bytes這個位元組數組按照charsetname解釋,組裝為一個String保存起來 
例如上面那個位元組數組[e4 bd a0],按照utf-8解釋的話,存儲起來就是”你”這個字元串,如果按照其他編碼解釋,則不會解釋為”你”

說個其他的,為什麼在servlet中處理參數一般都需要這麼一句了來控制編碼:

String str = new String(param.getBytes(“ISO-8859-1”),”UTF-8”);

其實這很好理解,瀏覽器傳過來的位元組數據是UTF-8編碼的,然後web容器預設這個位元組數據是ISO-8859-1編碼的,所以使用ISO-8859-1把這個位元組數據轉換變成了String存儲起來,相當於是進行了下麵這個操作:

String s = new String(UTF8Bytes,”ISO-8859-1”);

註意這個編碼是單位元組的,也就是將每一個位元組都轉換成了unicode編碼,幸好是這樣,使我們有機會將這個String再轉換成和原來一模一樣的位元組數組,所以才有了我們平時用的最多的那一句編碼處理的代碼

最後,想再說一下,對編碼這塊不瞭解的原因,是我們理解錯誤,我們必須知道的是:

java內部存儲字元串使用的unicode編碼 
我們通常會聽到有人說:“我需要將String由ISO-8859-1轉換為GBK編碼”,這又是怎麼回事呢?實際上,我們並不是要“將 一個由ISO-8859-1編碼的String轉換為GBK編碼的String”,反覆說明的是,JAVA中的String都是unicode編碼的,所以不存在“ISO- 8859-1編碼的String”或“GBK編碼的String”這樣的說法。而需要轉換的唯一的原因是String進行了錯誤的編碼。我們經常會碰到由ISO-8859- 1轉換為諸如GBK/UTF-8等等這樣的需求。所謂的轉換過程是:String –> byte[] –>String


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • shell Unix系統中常見的shell有:sh、csh、ksh、tcsh、bash 使用命令: vim /etc/shells 可以查看當前系統支持的bash shell執行腳本 shell執行腳本是一門解釋性語言、批量化處理語言,大大的節省了工作成本 shell腳本第一行必須以 #!開頭,它表 ...
  • glob 模式(globbing)也被稱之為 shell 通配符,名字的起源來自於 Unix V6 中的 /etc/glob (詳見 man 文檔)。glob 是一種特殊的模式匹配,最常見的是通配符拓展,也可以將 glob 模式設為精簡了的正則表達式,在最新的 CentOS 7 中已經刪除了 glo... ...
  • 當UNIX函數發生錯誤時,通常會返回一個負值,而且整形變數errno通常被設置為具有特定信息的值。 errno是全局變數,僅當函數出錯才有被改變。對待errno,應註意兩條規則 1:如果沒有出錯,其值不會被常式清除,也就是說,當且僅當函數出錯時,馬上檢查errno的值才有意義。 2:任何函數都不會將 ...
  • 在Linux系統中/tmp文件夾下的文件是會被清理、刪除的,文件清理的規則是如何設定的呢? 以Redhat為例,這個主要是因為作業裡面會調用tmpwatch命令刪除那些一段時間沒有訪問的文件。 那麼什麼是tmpwatch呢?其實tmpwatch是一個命令或者說是一個包。如下所示 tmpwatch -... ...
  • 1.安裝samba伺服器 2.配置 3.新建用戶名,新建文件夾並且設定ACL許可權 ACL: 1.查看是否具有ACL許可權 2.如果1什麼也沒輸出 那麼就需要添加許可權 在/ 那一欄中 磁碟格式後 配置前添加上acl即可 完成之後需要重啟(請設置好,不要不能開機哦!!!) 或者 3.配置acl 4.查看a ...
  • 一,項目背景 記得大學畢業課題,我就是選擇做個CMS,不過當時雖然做了個,不過感覺不是很好,所以現在又重做了,順便發上來供大家討論的。雖然CMS不是什麼特別的項目,但是還是想從一個普通項目學到更多的東西。 二,核心技術 使用asp.net mvc5 模板引擎使用razor。 還有簡單數據操作工具Wa ...
  • 開發中動態類型無外乎list 或者 vector, 這裡就是在C中實現vecotr結構容器部分. ...
  • java.lang.String.getBytes(String charsetName) 方法編碼將此String使用指定的字元集的位元組序列,並將結果存儲到一個新的位元組數組。 聲明 以下是java.lang.String.getBytes()方法的聲明 參數 charset -- 這是一個支持的字 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...