一、背景
最新在做小程序支付項目,在本地環(huán)境和linux 環(huán)境部署上運行沒有問題,但是部署到window 環(huán)境,請求易通支付接口時,對方返回
Try again later!io.vertx.core.json.Json.decodeValue(Json.java:168)
意思是 編碼格式出錯,對方技術人員也說大概率是編碼的問題,需要UTF-8。
所以打算抽出一下午的時間徹底搞懂 “中文亂碼”。
二、知識準備
-
ANSI,unicode與utf-8的區(qū)別
使計算機支持更多語言,通常使用 0x80~0xFFFF 范圍的 2 個 字節(jié)來表示 1 個字符。比如:漢字 ‘中’ 在 ANSI編碼 ANSI編碼 中文操作系統中,使用 [0xD6,0xD0] 這兩個字節(jié)存儲。
不同的國家和地區(qū)制定了不同的標準,由此產生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的編碼標準。這些使用多個字節(jié)來代表一個字符的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文Windows操作系統中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows操作系統中,ANSI編碼代表Big5;在日文Windows操作系統中,ANSI 編碼代表 Shift_JIS 編碼。
不同 ANSI 編碼之間互不兼容,當信息在國際間交流時,無法將屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。
- 中文操作系統默認ansi編碼
- unicode是國際通用編碼
- utf-8編碼是unicode編碼在網絡之間(主要是網頁)傳輸時的一種“變通”和“橋梁”編碼。utf-8在網絡之間傳輸時可以節(jié)約數據量。
三、程序運行源代碼歷經處理階段
一份代碼到運行得到正確輸出,經過步驟:
Java源代碼----Javac編譯成class字節(jié)碼文件----Java虛擬機JVM加載運行—操作系統----顯示設備。
Java源碼—字節(jié)碼:調用jdk的javac命令執(zhí)行編譯,javac默認采用系統字符集。通常我們會設置文件編碼UTF-8。使用命令編譯也可以加上-encoding UTF-8;
System.getProperty("file.encoding") //可以獲取當前系統使用的編碼字符集
Java字節(jié)碼—虛擬機—操作系統:虛擬機啟動的時候以什么字符集編碼來解析我們的class字節(jié)碼文件呢?這時候我們就通常會設置 -Dfile.encoding=utf-8 這里也就解釋了設置這個VM參數的意義了。
操作系統—顯示設備:針對編碼階段出現的中文,在這一步驟就需要操作系統安裝中文字體以支持中文。
四、問題描述
我們在Windows下運行jar包時,常常會出現亂碼,主要分為dos窗口輸出的日志中出現亂碼和程序返回數據出現亂碼。
- dos窗口輸出的日志中出現亂碼
執(zhí)行如下命令,將控制臺輸出編碼改為UTF8:
chcp 65001
- 程序返回數據出現亂碼
執(zhí)行如下命令,運行jar包時指定編碼為UTF8:
java -Dfile.encoding=utf-8 -jar xxx.jar
五、解決方法
1.修改項目編碼格式統一為UTF-8
Setting>>Editor>>File Encoding
2.將項目中的.idea文件夾中的encodings.xml文件中的編碼格式改為uft-8
3.File->Settings->Build,Execution,Deployment -> Compiler -> Java Compiler
設置 Additional command line parameters選項為 -encoding utf-8
4.然后在 Server > VM options 設置為 -Dfile.encoding=UTF-8
文章來源:http://www.zghlxwxcb.cn/news/detail-557992.html
5. SpringBoot yml 里配置 servlet 和tomcat 編碼
server:
port: 8082
servlet:
context-path: /api
encoding:
charset: UTF-8
tomcat:
uri-encoding: UTF-8
6. SpringBoot logback-config.xml 里面配置日志編碼UTF-8
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志存放路徑 -->
<springProperty scope="context" name="log.path" source="logging.file.path"/>
<!-- 日志輸出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<property name="log.charset" value="UTF-8"/>
<!-- 控制臺輸出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 系統日志輸出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>INFO</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循環(huán)政策:基于時間創(chuàng)建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 過濾的級別 -->
<level>ERROR</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 用戶訪問日志輸出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滾 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的歷史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
<charset>${log.charset}</charset>
</encoder>
</appender>
<!-- 系統模塊日志級別控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志級別控制 -->
<logger name="org.springframework" level="warn" />
<!--系統操作日志-->
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系統用戶操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>
7. java -jar xxx 命令里面添加UTF-8 編碼
java -Dfile.encoding=UTF-8 -jar xxxx.jar
window 下完整的執(zhí)行腳本:文章來源地址http://www.zghlxwxcb.cn/news/detail-557992.html
@echo off
chcp 65001
java -Dfile.encoding=UTF-8 -jar ./api.jar
到了這里,關于IntelliJ IDEA 統一設置編碼為utf-8編碼 及 SpringBoot 打 jar 包運行 在windows 平臺控制臺和日志 亂碼解決的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!