Java 18為什麼要指定UTF-8為預設字元集

来源:https://www.cnblogs.com/didispace/archive/2022/04/29/16205174.html
-Advertisement-
Play Games

在Java 18中,將UTF-8指定為標準Java API的預設字元集。有了這一更改,依賴於預設字元集的API將在所有實現、操作系統、區域設置和配置中保持一致。 做這一更改的主要目標: 當Java程式的代碼依賴於預設字元集時,使其更具可預測性和可移植性。 闡明標準Java API在哪裡使用預設字元集 ...


在Java 18中,將UTF-8指定為標準Java API的預設字元集。有了這一更改,依賴於預設字元集的API將在所有實現、操作系統、區域設置和配置中保持一致。

做這一更改的主要目標:

  • 當Java程式的代碼依賴於預設字元集時,使其更具可預測性和可移植性。
  • 闡明標準Java API在哪裡使用預設字元集。
  • 在整個標準Java API中對UTF-8進行標準化,但控制台I/O除外。

需要註意的是,這一更改的目標並不是定義新的標準Java API或受支持的JDK API,儘管這項工作可能會發現新的便利方法可能會使現有的API更易於使用,這一更改並不是要棄用或刪除依賴預設字元集的標準Java API。

用於讀寫文件和處理文本的標準Java API允許將字元集作為參數傳遞。字元集控制Java編程語言的原始位元組和16位字元值之間的轉換。例如,支持的字元集包括US-ASCII、UTF-8和ISO-8859-1。

如果沒有傳遞字元集參數,則標準的Java API通常使用預設的字元集。JDK在啟動時根據運行時環境選擇預設的字元集:操作系統、用戶的區域設置和其他因素。

因為預設字元集在每個地方都不一樣,所以使用預設字元集的API會帶來許多不明顯的危險,甚至對經驗豐富的開發人員也是如此。

考慮這樣一個應用程式,它在不傳遞字元集的情況下創建一個java.io.FileWriter,然後使用它將一些文本寫入文件。結果文件將包含一個使用運行應用程式的JDK的預設字元集編碼的位元組序列。第二個應用程式在不同的機器上運行,或者由同一臺機器上的不同用戶運行,在不傳遞字元集的情況下創建一個java.io.FileReader,並使用它來讀取該文件中的位元組。生成的文本包含使用運行第二個應用程式的JDK的預設字元集解碼的字元序列。如果第一個應用程式的JDK和第二個應用程式的JDK之間的預設字元集不同,則生成的文本可能會被損壞或不完整,因為FileReader無法判斷它使用了相對於FileWriter的錯誤字元集來解碼文本。

比如這就是一個典型的例子,在MacOS上以UTF-8編碼的日語文本文件在Windows上以美英或日語區域設置讀取時被損壞:

java.io.FileReader(“hello.txt”) -> “こんにちは” (macOS)
java.io.FileReader(“hello.txt”) -> “ã?“ã‚“ã?«ã?¡ã? ” (Windows (en-US))
java.io.FileReader(“hello.txt”) -> “縺ォ縺。縺ッ” (Windows (ja-JP)

在JDK 17及更早版本中,預設字元集是在Java運行時才確定的。在MacOS上,除POSIX C語言環境外,它是UTF-8。在其他操作系統上,取決於用戶的區域設置,比如:Windows上,它是基於代碼頁的字元集,如Windows-1252或Windows-31j。如果不清楚Java應用運行環境的預設編碼,可以使用這個命令查看當前JDK的預設字元集:

java -XshowSettings:properties -version 2>&1 | grep file.encoding

程式猿DD Tips:在過去的版本中,當讀寫文件時,沒有指明字元集的話,所選擇的字元集與操作系統、用戶區域等因素相關,而不同的操作系統的預設編碼不同,所以很可能會出現讀寫編碼不一致的情況,從而導致程式在不同系統下運行出現亂碼問題。所以這一更改可以讓Java開發的應用具備更好的移植性。同時,從這一點的改進,也提醒我們,在讀寫文件的時候,為了你的應用有更好的可移植性,在涉及讀寫操作的時候,一定要加上編碼參數。這樣即使在Java 18之前的版本,也能擁有更好的可移植性,同時為將來升級Java 21提供更好的相容前提。

本文配套視頻:https://www.bilibili.com/video/BV1YY4y1a7vGopen in new window

如果您學習過程中如遇困難?可以加入我們超高質量的技術交流群,參與交流與討論,更好的學習與進步!另外,不要走開,關註我!持續更新Java新特性教程

歡迎關註我的公眾號:程式猿DD。第一時間瞭解前沿行業消息、分享深度技術乾貨、獲取優質學習資源


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

-Advertisement-
Play Games
更多相關文章
  • 為什麼要使用Hexo Hexo 是一個快速、簡潔且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在幾秒內,即可利用靚麗的主題生成靜態網頁。Hexo支持Github Flavored Markdown的所有功能, 甚至可以整合Octopress的大多數插件. 並自己也擁有 ...
  • 首先我要說明一下,沒錯,還是沒有進入vue,劉備請諸葛亮三次都可以了吧,我這也是第三次了,也絕對是最後一次了,我應經摸透了因為,最後的webpack打包加上一個git學了過後我就去vue了。 為什麼要說先看這篇,其實跟我們今天的主題webpack沒有太大關係,昨天學了一下webpack,其實內容沒多 ...
  • CSS 陰影的存在,讓物體看上去更加有型立體。 然而,在最簡單的陰影使用之上,我們可以實現更多有意思且更加立體的陰影效果。 本文將帶大家看看如何使用 CSS 實現幾類比普通陰影更加立體的陰影效果。 CSS 陰影基礎 CSS 中,明面上可以實現陰影的有三個屬性: box-shadow - 盒陰影 te ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 對閉包的理解 閉包是指有權訪問另一個函數作用域中變數的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,創建的函數可以訪問到當前函數的局部變數。 閉包有兩個常用的用途; 閉包的第一個用途是使我們在函數外部能夠訪問到函數內部 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 1. 對原型、原型鏈的理解 在JavaScript中是使用構造函數來新建一個對象的,每一個構造函數的內部都有一個 prototype 屬性,它的屬性值是一個對象,這個對象包含了可以由該構造函數的所有實例共用的屬性和方法。當使用構造函數新建 ...
  • 一、一體化運營平臺前端請求部分 1.介面封裝 一體化運營平臺採用的是封裝axios的方式來簡化請求介面的使用,在添加新介面時只要調用封裝好的方法就可以發出請求並直接得到解析後的數據 2.整個過程解析 (1)請求方法調用request方法並傳需要的參數 sync_collect_diff_data(d ...
  • 大家好,我是半夏👴,一個剛剛開始寫文的沙雕程式員.如果喜歡我的文章,可以關註➕ 點贊 👍 加我微信:frontendpicker,一起學習交流前端,成為更優秀的工程師~關註公眾號:搞前端的半夏,瞭解更多前端知識! 點我探索新世界! 原文鏈接 ==>http://sylblog.xin/archi ...
  • 微服務概覽 微服務是圍繞業務領域建模可獨立發佈的服務。服務封裝了對應功能並可以通過網路被其他服務訪問。 從外部來看,單個微服務被視為一個黑盒子。它使用最合適的協議在一個或多個網路端點(例如,隊列或REST API)上承載業務功能。消費者,無論他們是其他微服務還是其他類型的程式,都通過這些聯網的端點來 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...