ubuntu下maven构建工程中文乱码

本文介绍了一种解决在Eclipse中遇到的中文乱码问题的方法。通过调整项目文件编码及Eclipse设置,最终实现了中文字符的正确显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从github上git clone一项目到本地,然后mvn eclipse:eclipse后,导入到eclipse中,发现工程中的中文都是乱码

 

一般工程乱码,都是到eclipse中设置:Window->Preferences->General->Workspace->Text file encoding

 

该项默认是utf-8,后发现 工程目录下的.settings目录下org.eclipse.jdt.core.prefs文件中有设置编码的信息,我的这个文件对应

 

内容如下:

  1 #Wed May 08 21:09:24 CST 2013
  2 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
  3 eclipse.preferences.version=1
  4 encoding/src/main/java=GBK
  5 org.eclipse.jdt.core.compiler.source=1.6
  6 encoding/src/test/resources=GBK
  7 encoding/src/main/resources=GBK
  8 encoding/src/test/java=GBK
  9 org.eclipse.jdt.core.compiler.compliance=1.6

 

看了上面的内容,大概就明白为啥是乱码了,但是用

mvn  -Dmaven.test.skip=true -Dproject.build.sourceEncoding=UTF-8  eclipse:eclipse

 

 

重新生成项目文件,还是乱码。

 

 后面没办法了,只好查看java文件的编码,用vi打开文件:set fileencoding 发现文件编码都是latin1 ,彻底

 

无语啊 ,  把java文件转为utf-8 

enca    -x utf-8 *.java

 

中文显示就正常了,但是enca不支持文件夹递归处理。所以只得到每个目录下转换。

 

 好吧,写到最后,发现该问题和文章标题不符,哈哈,懒得改了。

 

 

其实,不用enca转换也是可以的,enca转换太麻烦。

 

把原始工程导入到eclise后,设置工程的编码为GBK即可,虽然ubuntu下eclipse没有GBK那个选项,手动输

 

入即可。

<think>我们面对的问题是:在Windows IntelliJ IDEA开发Java项目时,使用默认编码读取字符串,部署到Linux服务器后出现乱码。根本原因是Windows和Linux默认编码不一致(Windows通常为GBK,Linux通常为ISO-8859-1或UTF-8)导致。 解决方案的核心:统一编码为UTF-8。以下是具体步骤: 1. **开发环境设置(IntelliJ IDEA)**: - 设置全局编码:File -> Settings -> Editor -> File Encodings - Global Encoding: UTF-8 - Project Encoding: UTF-8 - Default encoding for properties files: UTF-8(并勾选Transparent native-to-ascii conversion)[^1][^3] - 设置运行配置:在Run/Debug Configurations中,VM options添加:`-Dfile.encoding=UTF-8`[^1] - 修改IDEA安装目录下的配置文件(可选,确保IDEA本身使用UTF-8启动): 在`idea64.exe.vmoptions`(64位)或`idea.exe.vmoptions`文件中添加: ``` -Dfile.encoding=UTF-8 -Djdk.util.zip.ensureTrailingSlash=false ```[^2] 2. **代码层面**: - 避免使用无参的`getBytes()`和`String(byte[])`方法,显式指定编码: ```java // 读取字符串时指定编码(如从文件或网络) String text = new String(byteArray, StandardCharsets.UTF_8); // 将字符串转为字节数组时指定编码 byte[] bytes = text.getBytes(StandardCharsets.UTF_8); ``` - 对于Web应用,设置HTTP响应编码: - 在Spring MVC中,使用`@RequestMapping`的produces属性: ```java @RequestMapping(value = "/data", produces = "application/json;charset=UTF-8") @ResponseBody public String getData() { ... } ```[^4] - 或者设置全局过滤器(Servlet规范): ```java // 在Filter中设置请求和响应的编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); ``` 3. **部署环境(Linux服务器)**: - 设置JVM默认编码:在启动脚本中(如Tomcat的catalina.sh)添加: ```bash export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" ``` - 检查系统区域设置(确保支持UTF-8): ```bash locale # 查看当前设置 # 若未使用UTF-8,可修改/etc/default/locale(Ubuntu)或/etc/locale.conf(CentOS) LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 ``` 4. **文件处理**: - 确保项目中的文本文件(如.properties、.xml、.txt)以UTF-8编码保存(IDEA中右键文件 -> File Encoding -> UTF-8)。 5. **验证**: - 在代码中输出当前默认编码确认: ```java System.out.println("Default Charset: " + Charset.defaultCharset()); ``` 通过以上步骤,可确保开发、构建、部署全流程使用UTF-8编码,避免跨平台乱码。 §§相关问题§§ 1. 如何在Java中强制指定所有IO操作的默认编码为UTF-8? 2. 当处理第三方库返回的字节数组时,如何避免编码不一致导致的乱码? 3. 在分布式系统中,不同服务节点编码不一致会导致什么问题?如何统一?</think>### 解决跨操作系统编码乱码问题(Windows开发→Linux部署) #### 一、核心问题分析 根本原因是**Windows与Linux默认编码不一致**: - **Windows默认编码**:GBK(简体中文系统) - **Linux默认编码**:ISO-8859-1或UTF-8(常见于Ubuntu/CentOS) 当使用无参方法`getBytes()`或`new String(byte[])`时,会使用JVM默认编码,导致: ```java // Windows开发环境(GBK) byte[] winBytes = "中文".getBytes(); // GBK编码:[-42, -48, -50, -60] // Linux生产环境(ISO-8859-1) String linuxStr = new String(winBytes); // 解码为乱码"中文" ``` #### 二、解决方案(全链路UTF-8统一) ##### 1. **开发环境设置(IntelliJ IDEA)** | 设置位置 | 操作步骤 | 截图指引 | |-------------------------|--------------------------------------------------------------------------|---------------| | **全局编码** | `File → Settings → Editor → File Encodings` → 设置Global/Project Encoding为UTF-8 | [^3] | | **运行配置** | `Run → Edit Configurations → VM options`添加:`-Dfile.encoding=UTF-8` | [^1] | | **IDEA启动配置** | 在`idea64.exe.vmoptions`中添加:`-Dfile.encoding=UTF-8` | [^2] | | **文件模板编码** | `Settings → Editor → File and Code Templates` → 所有模板头部添加:`#set($charset = "UTF-8")` | - | ##### 2. **代码层强制指定编码** ```java // 所有IO操作显式指定UTF-8 // 读取文件 String content = Files.readString(Path.of("data.txt"), StandardCharsets.UTF_8); // 网络传输 byte[] bytes = "中文数据".getBytes(StandardCharsets.UTF_8); // ✅显式指定 String received = new String(bytes, StandardCharsets.UTF_8); // ✅显式指定 // Spring MVC接口 @GetMapping(value = "/data", produces = "application/json;charset=UTF-8") // [^4] public String getData() { ... } ``` ##### 3. **构建与部署配置** | 环境 | 配置方式 | |------------|--------------------------------------------------------------------------| | **Maven** | 在`pom.xml`中配置编码属性: ```xml <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> ``` | | **Tomcat** | 在`catalina.sh`中添加: ```bash export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" ``` | | **Docker** | 基础镜像设置: ```Dockerfile FROM openjdk:17 ENV LANG C.UTF-8 ENV JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF-8" ``` | ##### 4. **验证与调试** ```java // 部署后验证实际编码 System.out.println("实际编码: " + Charset.defaultCharset().name()); ``` - 预期输出:`实际编码: UTF-8` - 异常处理:若输出非UTF-8,检查JVM启动参数和环境变量 #### 三、关键预防措施 1. **禁用无参编码方法** 团队规范:禁止使用`getBytes()`和`new String(byte[])`,必须显式指定`StandardCharsets.UTF_8` 2. **文件编码检测** 在CI/CD流程中添加检查: ```bash # 检测非UTF-8文件 find src/ -type f -exec file -i {} \; | grep -v "utf-8" ``` 3. **日志系统加固** Logback配置中强制UTF-8: ```xml <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>app.log</file> <encoder charset="UTF-8"> <pattern>%msg%n</pattern> </encoder> </appender> ``` > **效果验证**: > 通过全链路UTF-8统一,中文字符在Windows开发环境与Linux生产环境将保持完全一致: > ``` > 原始:中文 → Windows字节:[ -28, -72, -83, -26, -106, -121 ] > → Linux解码:中文(正确) > ``` #### 四、特殊场景处理 - **数据库连接**:JDBC URL添加`useUnicode=true&characterEncoding=UTF-8` - **第三方API调用**:若响应乱码,用`new String(respBytes, "GBK")`尝试解码(针对中文服务) - **Excel文件**:使用Apache POI时设置编码: ```java WorkbookSettings settings = new WorkbookSettings(); settings.setEncoding("UTF-8"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值