IntelliJ IDEA establece uniformemente la codificación en codificación utf-8 y el paquete jar de SpringBoot se ejecuta en la consola de la plataforma de Windows y resuelve los registros ilegibles

1. Antecedentes

El último proyecto de pago de programa pequeño está funcionando, y no hay problemas para ejecutarse en el entorno local y la implementación del entorno de Linux, pero cuando se implementa en el entorno de la ventana, al solicitar la interfaz de pago de Yitong, la otra parte regresa


¡Vuelva a intentarlo más tarde! problema de codificación y se requiere UTF-8.

Así que planeo dedicar una tarde a comprender a fondo los "caracteres ilegibles chinos".

2. Preparación del conocimiento

  • La diferencia entre ANSI, unicode y utf-8
    Para que la computadora admita más idiomas, generalmente use 2 bytes en el rango de 0x80~0xFFFF para representar 1 carácter. Por ejemplo: el carácter chino '中' se almacena en los dos bytes [0xD6,0xD0] en el sistema operativo chino con codificación ANSI con codificación ANSI.
    Diferentes países y regiones han formulado diferentes estándares, lo que da como resultado sus propios estándares de codificación, como GB2312, GBK, GB18030, Big5 y Shift_JIS. Estos diversos métodos de codificación de extensión de caracteres chinos que utilizan varios bytes para representar un carácter se denominan codificación ANSI. En el sistema operativo Windows en chino simplificado, la codificación ANSI representa la codificación GBK; en el sistema operativo Windows en chino tradicional, la codificación ANSI representa Big5; en el sistema operativo Windows en japonés, la codificación ANSI representa la codificación Shift_JIS.
    Los diferentes códigos ANSI no son compatibles entre sí. Cuando se intercambia información a nivel internacional, el texto que pertenece a dos idiomas no se puede almacenar en el mismo texto codificado ANSI.
  1. El sistema operativo chino tiene por defecto la codificación ansi
  2. Unicode es una codificación universal internacional
  3. La codificación UTF-8 es una "solución alternativa" y una codificación "puente" para la codificación Unicode cuando se transmite entre redes (principalmente páginas web). UTF-8 puede ahorrar volumen de datos al transferir entre redes.

3. El código fuente del programa se ejecuta a través de la etapa de procesamiento

Un fragmento de código para ejecutar para obtener el resultado correcto, después de los pasos:

Código fuente de Java----Javac se compila en un archivo de código de bytes de clase----JVM de la máquina virtual de Java carga y ejecuta el sistema operativo----dispositivo de visualización.

Código fuente de Java: código de bytes: llame al comando javac de jdk para ejecutar la compilación, y javac usa el conjunto de caracteres del sistema de forma predeterminada. Por lo general, configuraremos la codificación del archivo UTF-8. La compilación con el comando también puede agregar -codificación UTF-8;

System.getProperty("file.encoding")   //可以获取当前系统使用的编码字符集

Código de bytes de Java, máquina virtual, sistema operativo: ¿Qué codificación de juego de caracteres se usa para analizar nuestro archivo de código de bytes de clase cuando se inicia la máquina virtual? En este momento, generalmente configuramos -Dfile.encoding=utf-8. Aquí también se explica el significado de configurar este parámetro de VM.

Sistema operativo: dispositivo de visualización: para el chino que aparece en la etapa de codificación, en este paso, el sistema operativo debe instalar fuentes chinas para admitir chino.

4. Descripción del problema

Cuando ejecutamos el paquete jar en Windows, a menudo hay caracteres ilegibles, que se dividen principalmente en caracteres ilegibles en la salida de registro de la ventana de DOS y caracteres ilegibles en los datos devueltos por el programa.

  • Aparecen caracteres ilegibles en la salida del registro por la ventana DOS
    Ejecute el siguiente comando para cambiar la codificación de salida de la consola a UTF8:
chcp 65001
  • Los datos devueltos por el programa están distorsionados.
    Ejecute el siguiente comando y especifique la codificación como UTF8 cuando ejecute el paquete jar:
java -Dfile.encoding=utf-8 -jar xxx.jar

Cinco, la solución

1. Modifique el formato de codificación del proyecto a UTF-8

Configuración>>Editor>>Codificación de archivos
inserte la descripción de la imagen aquí

2. Cambie el formato de codificación en el archivo encodings.xml en la carpeta .idea del proyecto a uft-8

inserte la descripción de la imagen aquí

3.Archivo->Configuración->Compilación, Ejecución, Despliegue -> Compilador -> Compilador de Java

Establezca la opción de parámetros de línea de comandos adicionales en -encoding utf-8
inserte la descripción de la imagen aquí

4. Luego establezca -Dfile.encoding=UTF-8 en Servidor > Opciones de VM

inserte la descripción de la imagen aquí

5. Configure la codificación de servlet y tomcat en SpringBoot yml

server:
  port: 8082
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
  tomcat:
    uri-encoding: UTF-8

6. Configure la codificación de registro UTF-8 en SpringBoot logback-config.xml

<?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>
        <!-- 循环政策:基于时间创建日志文件 -->
		<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>
        <!-- 循环政策:基于时间创建日志文件 -->
        <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. Agregue la codificación UTF-8 al comando java -jar xxx

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

El script de ejecución completo en la ventana:

@echo off
chcp 65001
java -Dfile.encoding=UTF-8 -jar ./api.jar 

Supongo que te gusta

Origin blog.csdn.net/u014212540/article/details/130637106
Recomendado
Clasificación