上一篇                     
               
			  Java如何存储生僻字?
- 后端开发
- 2025-06-19
- 4039
 在Java中保存生僻字需确保使用UTF-8编码: ,1. 文件读写时指定
 
 
StandardCharsets.UTF_8 ,2. 数据库连接字符串添加
 characterEncoding=UTF-8 ,3. 网页传输设置
 Content-Type: text/html;charset=UTF-8 ,4. 避免使用默认编码(如GBK),防止生僻字变成
 �乱码,字符串内部采用Unicode存储,关键在I/O时正确编解码。
在Java中保存生僻字(如𠀀、𠮟、𡈽等Unicode扩展字符)的核心在于正确处理字符编码和存储流程,以下是详细解决方案:
生僻字保存原理
- Unicode支持:生僻字通常位于Unicode的CJK扩展区(如B区、C区),需4字节表示(如U+20000)。
- Java内部表示:Java使用UTF-16编码,生僻字会被拆分为代理对(Surrogate Pair)(两个char)。
- 关键编码:必须使用支持4字节的编码格式(UTF-8/UTF-16),避免使用GBK等仅支持2字节的编码。
保存生僻字的完整步骤
文件存储(UTF-8编码)
import java.io.*;
public class SaveRareCharacter {
    public static void main(String[] args) throws IOException {
        String rareChar = "𠮷"; // 生僻字示例(U+20BB7)
        // 写入文件(强制指定UTF-8)
        try (BufferedWriter writer = new BufferedWriter(
                new OutputStreamWriter(
                    new FileOutputStream("rare_chars.txt"), 
                    StandardCharsets.UTF_8))) {
            writer.write(rareChar);
        }
        // 读取验证
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(
                    new FileInputStream("rare_chars.txt"), 
                    StandardCharsets.UTF_8))) {
            String readChar = reader.readLine();
            System.out.println("读取结果: " + readChar); // 应输出𠮷
        }
    }
} 
数据库存储(MySQL示例)
import java.sql.*;
public class DatabaseSave {
    public static void main(String[] args) throws SQLException {
        String rareChar = "𡈽"; // 生僻字(U+2123D)
        // 关键配置:连接字符串指定UTF-8
        String url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
        try (Connection conn = DriverManager.getConnection(url, "user", "pass");
             PreparedStatement pstmt = conn.prepareStatement(
                 "INSERT INTO rare_chars (character) VALUES (?)")) {
            pstmt.setString(1, rareChar);
            pstmt.executeUpdate();
        }
        // 验证查询
        try (Connection conn = DriverManager.getConnection(url, "user", "pass");
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT character FROM rare_chars")) {
            while (rs.next()) {
                System.out.println("数据库读取: " + rs.getString(1));
            }
        }
    }
} 
数据库配置要求:
- 表字段字符集:utf8mb4(MySQL必须)
- 排序规则:utf8mb4_unicode_ci
网络传输处理
// 发送方(明确指定Content-Type)
String rareChar = "𠀀";
byte[] bytes = rareChar.getBytes(StandardCharsets.UTF_8);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Content-Type", "text/plain; charset=UTF-8"); // 关键头信息
conn.getOutputStream().write(bytes);
// 接收方
InputStream input = conn.getInputStream();
String received = new String(input.readAllBytes(), StandardCharsets.UTF_8); 
避坑指南
-  乱码问题: - 根源:使用了不支持4字节的编码(如ISO-8859-1)
- 解决方案:全程统一使用UTF-8
 
-  Java字符串长度误区:  String s = "𠮷"; System.out.println(s.length()); // 输出2(代理对长度) System.out.println(s.codePointCount(0, s.length())); // 输出1(实际字符数) 
-  文件BOM头问题: - 避免用FileWriter(无法指定编码),改用OutputStreamWriter
- 不需要主动添加BOM,Java默认不写入BOM
 
- 避免用
-  数据库乱码排查: SHOW CREATE TABLE rare_chars; -- 检查字段是否为utf8mb4 SHOW VARIABLES LIKE 'character_set%'; -- 确认全局字符集 
最佳实践
-  环境统一:  - 源码文件保存为UTF-8(编译器设置)
- JVM参数:-Dfile.encoding=UTF-8
- 数据库连接字符串显式声明UTF-8
 
-  字符验证方法: String rareChar = "𠮷"; int codePoint = rareChar.codePointAt(0); System.out.printf("U+%04X", codePoint); // 输出U+20BB7
-  特殊场景处理: - 文件路径含生僻字:使用java.nio.file.PathsPath path = Paths.get("C:/生僻字目录𠮷"); Files.createDirectories(path); // 安全创建目录
 
- 文件路径含生僻字:使用
引用说明:
- Unicode标准文档:https://unicode.org
- Oracle官方字符编码指南:https://docs.oracle.com/javase/tutorial/i18n/text/string.html
- MySQL字符集配置:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html
- UTF-8编码规范:RFC 3629
通过统一使用UTF-8编码、配置正确的数据库字符集(utf8mb4)并避免中间环节的编码转换,可确保生僻字在Java应用中安全存储与传输,实际开发中需确保全链路(文件、DB、网络)字符集一致性。
 
 
 
			