最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中字符編碼問題的解決方法詳解

 更新時間:2025年09月15日 08:33:13   作者:網羅開發(fā)  
在日常 Java 開發(fā)中,字符編碼問題是一個非常常見卻又特別容易踩坑的地方,這篇文章就帶你一步一步看清楚字符編碼的來龍去脈,并結合可運行的代碼,看看如何在 Java 項目里徹底解決編碼不一致的問題

前言

在日常 Java 開發(fā)中,字符編碼問題是一個非常常見卻又特別容易踩坑的地方。尤其是在不同操作系統(tǒng)之間切換,或者從前端傳到后端、再到數據庫,編碼沒統(tǒng)一好,中文就會出現(xiàn)“亂碼”。很多同學第一次遇到的時候,會被一大堆奇怪的方塊符號或者問號整崩潰。

這篇文章就帶你一步一步看清楚字符編碼的來龍去脈,并結合可運行的代碼,看看如何在 Java 項目里徹底解決編碼不一致的問題。

背景:為什么會出現(xiàn)編碼問題

其實原因很簡單:不同系統(tǒng)、不同軟件的默認字符編碼不一樣。

  • Windows 上默認編碼是 GBK 或 CP936。
  • Linux、Mac 大部分是 UTF-8。
  • 數據庫可能是 Latin1、GBK 或 UTF-8。
  • Tomcat、IDEA 默認也可能不是 UTF-8。

舉個例子,如果你的 Java 程序里寫了一行中文字符串 "你好",在 UTF-8 下存儲沒問題,但如果有人用 GBK 來讀取,就會直接炸掉,變成“亂碼”。

常見場景分析

控制臺輸出亂碼

在 Windows 的 CMD 下運行 Java 程序時,經常會看到控制臺打印中文是亂碼。這是因為 Windows 控制臺默認用 GBK 編碼,但你的 Java 程序里可能用的是 UTF-8。

public class EncodingDemo {
    public static void main(String[] args) {
        String msg = "你好,世界";
        System.out.println(msg);
    }
}

在 Linux/Mac 控制臺上運行,大概率沒問題。但在 Windows CMD 里,就會看到一堆奇怪符號。

文件讀寫亂碼

當你從文件里讀中文內容時,如果讀的時候用的編碼和寫的時候不一樣,也會直接出錯。

import java.io.*;

public class FileEncodingDemo {
    public static void main(String[] args) throws Exception {
        String text = "中文內容測試";

        // 寫入文件,強制使用 UTF-8
        try (Writer writer = new OutputStreamWriter(new FileOutputStream("test.txt"), "UTF-8")) {
            writer.write(text);
        }

        // 讀取文件(錯誤示范:不指定編碼)
        try (BufferedReader reader = new BufferedReader(new FileReader("test.txt"))) {
            System.out.println("讀到的內容:" + reader.readLine());
        }

        // 正確方式:指定 UTF-8
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream("test.txt"), "UTF-8"))) {
            System.out.println("正確讀到的內容:" + reader.readLine());
        }
    }
}

運行后你會發(fā)現(xiàn),沒指定編碼時中文是亂碼,指定了 UTF-8 之后就正常了。

數據庫存取亂碼

數據庫也是高頻出錯點,比如 MySQL 默認的 latin1 編碼就很坑。假設表結構是這樣的:

CREATE TABLE user (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50)
) DEFAULT CHARSET=latin1;

如果你在 Java 里用 UTF-8 往里面寫入 "張三",再讀出來時就會發(fā)現(xiàn)已經是亂碼。

解決辦法是:

建庫建表時就指定 utf8mb4

CREATE DATABASE demo DEFAULT CHARSET=utf8mb4;

JDBC 連接時也要加上編碼參數:

spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC

解決方案

那我們該怎么統(tǒng)一解決這個問題呢?其實有幾個常見思路:

統(tǒng)一使用 UTF-8

UTF-8 是現(xiàn)在最通用的編碼方式,跨系統(tǒng)兼容性最好。所以最穩(wěn)妥的做法就是:整個鏈路都統(tǒng)一成 UTF-8。
包括:源代碼文件、編譯參數、運行參數、數據庫配置、Tomcat 配置。

比如在 Maven 項目里,你可以在 pom.xml 里強制指定源碼編碼:

<project>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
</project>

這樣即便在 Windows 上編譯,結果也不會變。

設置 JVM 參數

如果你發(fā)現(xiàn)運行環(huán)境默認編碼不是 UTF-8,可以在 JVM 啟動時加上參數:

java -Dfile.encoding=UTF-8 -jar app.jar

這會讓整個 Java 虛擬機的默認編碼改成 UTF-8,很多情況下能一勞永逸。

數據庫設置字符集

在 MySQL 里,推薦直接用 utf8mb4,這樣連 emoji 表情都能存:

ALTER DATABASE demo CHARACTER SET utf8mb4;
ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4;

同時,Java 里的 JDBC 連接也要顯式指定編碼,否則還是會出問題。

實際案例:亂碼排查經驗

我自己就踩過一個坑:在 Windows 下本地開發(fā),數據庫是 utf8mb4,項目里也設了 -Dfile.encoding=UTF-8,一切正常。但是代碼上線到 Linux 服務器后,日志里的中文全是亂碼。排查了半天,最后發(fā)現(xiàn)是 日志框架的配置文件沒聲明 UTF-8,導致寫日志文件時被當成系統(tǒng)默認編碼。

后來改了一行配置就好了:

<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
    <charset>UTF-8</charset>
    <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>

所以要點就是:不要依賴默認值,凡是涉及到字符集的地方都要顯式聲明 UTF-8。

總結

Java 的字符編碼問題,說白了就是“讀和寫不一致”。解決它的核心就是統(tǒng)一,特別是統(tǒng)一用 UTF-8。

  • 源代碼、編譯、運行 JVM 都統(tǒng)一 UTF-8。
  • 文件讀寫時顯式指定編碼。
  • 數據庫用 utf8mb4 并在 JDBC 連接里加上參數。

只要做到這幾點,基本就不會再遇到莫名其妙的亂碼問題。

到此這篇關于Java中字符編碼問題的解決方法詳解的文章就介紹到這了,更多相關Java字符編碼內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • java 可變參數詳解及實例

    java 可變參數詳解及實例

    這篇文章主要介紹了java 可變參數詳解及實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • 一篇文章帶你入門java集合

    一篇文章帶你入門java集合

    Java的集合類型都是對java.util包中Collection接口的繼承,這里我們主要介紹依賴于collection的一些主分支,一起來看一下Java中的collection集合類型總結
    2021-08-08
  • Java將Word文件轉為OFD文件

    Java將Word文件轉為OFD文件

    大家好,本篇文章主要講的是Java將Word文件轉為OFD文件,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • MyBatis-Plus多數據源的示例代碼

    MyBatis-Plus多數據源的示例代碼

    本文主要介紹了MyBatis-Plus多數據源的示例代碼,包括依賴配置、數據源配置、Mapper 和 Service 的定義,具有一定的參考價值,感興趣的可以了解一下
    2024-05-05
  • mybatis快速入門學習教程新手注意問題小結

    mybatis快速入門學習教程新手注意問題小結

    MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架。接下來通過本文給大家介紹mybatis快速入門學習教程新手注意問題小結,需要的朋友可以參考下
    2017-02-02
  • serialVersionUID作用全面解析

    serialVersionUID作用全面解析

    這篇文章全面解析了java中serialVersionUID的作用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • SpringCloud創(chuàng)建多模塊項目的實現(xiàn)示例

    SpringCloud創(chuàng)建多模塊項目的實現(xiàn)示例

    ,Spring Cloud作為一個強大的微服務框架,提供了豐富的功能和組件,本文主要介紹了SpringCloud創(chuàng)建多模塊項目的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • MyBatis XML 配置文件之從配置規(guī)范到 CRUD 開發(fā)實踐記錄

    MyBatis XML 配置文件之從配置規(guī)范到 CRUD 開發(fā)實踐記錄

    本文介紹了MyBatis的XML配置文件的使用,包括數據庫連接配置、MyBatis配置、XML文件的核心組成成分以及增刪查改操作的示例,感興趣的朋友跟隨小編一起看看吧
    2026-01-01
  • Java實現(xiàn)Windows計算器界面

    Java實現(xiàn)Windows計算器界面

    這篇文章主要為大家詳細介紹了Java實現(xiàn)Windows計算器界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Spring?Data?JPA命名約定查詢實現(xiàn)方法

    Spring?Data?JPA命名約定查詢實現(xiàn)方法

    這篇文章主要為大家介紹了Spring?Data?JPA命名約定查詢實現(xiàn)方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12

最新評論

沅陵县| 辽阳县| 河池市| 北海市| 天峨县| 吕梁市| 宜兰市| 项城市| 定西市| 隆德县| 弋阳县| 延边| 墨竹工卡县| 仁怀市| 汉川市| 蓝田县| 邮箱| 上蔡县| 定安县| 富民县| 遂宁市| 保山市| 广昌县| 榆林市| 饶阳县| 汶川县| 沙河市| 蓝田县| 新泰市| 买车| 房产| 陈巴尔虎旗| 合肥市| 东丰县| 巴林左旗| 宁蒗| 庄浪县| 龙江县| 永善县| 津市市| 天峨县|