Maven ,命令行中,字符编码 设置

14 篇文章 0 订阅
12 篇文章 1 订阅

目录

■前言(遇到的问题)

■具体操作 (尝试命令行设置 mavne 运行环境编码)

1.设置环境变量

2.效果

■解决办法 (在POM中指定 java 运行时的 编码格式)

■file.encoding 参数默认值 : 操作系统编码

■扩展

1. java代码中检测操作系统语言(语言环境)

(上面的4,5,6行) 不受下面的命令影响,但是,下面参数不指定时,(9.10行)使用默认使用系统环境的语言。

Linux 查看系统环境语言命令

2.Java如何在创建文件时指定编码

3.编码格式

4.Maven命令行操作

5.maven-surefire-plugin

6.Junit (私密)

■源码分析 (getBytes()方法 受 file.encode 设定影响的原因)


■前言(遇到的问题)

Eclipse中运行Junit

通过Maven命令  mvn clean test 运行Junit得到的结果不一样

模拟代码

package com.sxz.test;

public class TestEncode {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		String str = "ア"; // 实际程序中, 设置是变量
		int length = str.getBytes().length;  
		System.out.println(length); // 实际程序中, length 作为逻辑判断使用
		
	}

}

(日语中,半角 ア

     Eclipse中运行,被判定为 3 个字节。  // UTF-8                                        Common中,选择(Encode) UTF-8   

                                            相当于:java -Dfile.encoding=UTF-8 TestEncode

     windows 命令行 中运行,被判定为 1 个字节。   // MS932  (Shift JIS)       WIndow 采用的编码

                                            相当于:java -Dfile.encoding=SJIS TestEncode

     ST环境(Linux)中运行,被判定为  X 个字节。 

                                           X 是多少,要看环境的语言环境,使用【locale】命令来查看系统默认语言的编码,

                                                ・如果是UTF-8, 那么还是3个字节  (目前我们使用的环境,虽然是linux系统,但是默认字符集是UTF-8)

                                                ・如果是EUC-JP,那么是两个字节

                                                         //  EUC-JP                       EUC-JP是被Linux和Solaris广泛地使用的文字编码。

                                                         相当于:java -Dfile.encoding=EUC-JP TestEncode

怀疑和编码格式有关,所以进行了相关调查。

(确实和编码有关,  是和Java运行时的编码有关。)

下面是Eclipse 中 Junit中的设定

---------------------------------------------------------------------

inherited  英 [ɪnˈherɪtɪd] adj. 通过继承得到的,遗传的 v. 继承(inherit的过去式和过去分词) 

デフォルト-継承(U)(UTF-8)

(这里的继承,指的 是 继承 java文件的编码格式)

 ---------------------------------------------------------------------

注意:Eclipse中的这个设定,对应的 java命令行参数是   -Dfile.encoding=UTF-8  // 指定JVM运行时所采用的编码

■具体操作 (尝试命令行设置 mavne 运行环境编码)

1.设置环境变量

set MAVEN_OPTS= -Duser.language=UTF-8 -Dfile.encoding=UTF-8

2.效果

 ----

Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: C:\Nane\Program Files\apache-maven-3.6.3\bin\..
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_191\jre
Default locale: utf-8_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

 ----

■解决办法 (在POM中指定 java 运行时的 编码格式)

安装以上设定,虽然,貌似已经修改了java运行时的 编码格式

但是,在实际运行时,还是按照  MS932 的编码格式运行了。

要直接修改POM文件,在POM文件中指定编码格式,才能解决问题!

       <argLine>${argLine} -Xmx1024m -Dfile.encoding=UTF-8</argLine>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.22.1</version>
    <configuration>
        <argLine>${argLine} -Xmx1024m -Dfile.encoding=UTF-8</argLine>
        <!--<skipTests>true</skipTests>-->
    </configuration>
</plugin>

最终设置编码如下(选择实际运行环境的编码   UTF-8)

×   <argLine>${argLine} -Xmx1024m -Dfile.encoding=EUC-JP</argLine>

〇  <argLine>${argLine} -Xmx1024m -Dfile.encoding=UTF-8</argLine>

虽然实际运行的环境是,linux环境,而且java运行时,没有指定 编码方式 (使用系统默认的编码方式)

但是,系统的默认的编码方式,并不是 EUC-JP,而是UTF-8

使用下面命令,便可查看系统的默认编码方式

locale

file.encoding 参数默认值 : 操作系统编码

java运行时参数file.encoding和sun.jnu.encoding详解 - 简书

如何查看,操作系统编码

env | grep LANG=

扩展

1. java代码中检测操作系统语言(语言环境)

import java.util.Locale;
import java.nio.charset.Charset;
...
System.getProperty( Locale.getDefault() );
System.getProperty(  System.getProperty("user.country") );
System.getProperty(  System.getProperty("user.language") );

System.out.println(System.getProperties().get("file.encoding"));
System.out.println(Charset.defaultCharset());

(上面的4,5,6行) 不受下面的命令影响,但是,下面参数不指定时,(9.10行)使用默认使用系统环境的语言。

java -Dfile.encoding=UTF-8 TestEncode

Linux 查看系统环境语言命令

locale

sxz001@sxzap01:~$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
sxz001@sxzap01:~$

---

2.Java如何在创建文件时指定编码

・读取文件
FileInputStream fis=new FileInputStream(“xxxx.txt”);
・写文件
OutputStreamWriter osw=new OutputStreamWriter(fis,“UTF-8”);

Java API 8官方文档,File没有提供可以指定字符编码的构造函数。(即,读取文件时,没有办法指定编码格式)

 ---

3.编码格式

文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Windows-31 、EUC-JP 、EBCDIC 等等之间的区别与联系_sun0322的博客-CSDN博客_sjis编码

---

对于 Shift-JIS 编码的理解 (win10中 查看 Shift-JIS 编码 コード)_sun0322的博客-CSDN博客_shift-jis

---

4.Maven命令行操作

在 命令行 (cmd)执行 Maven命令,对java工程进行打包 操作 (指定settings.xml)_sun0322的博客-CSDN博客_mvn命令在cmd执行

--

5.maven-surefire-plugin

在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)

下所有符合一组命名模式的测试类。这组模式为:

**/Test*.java:任何子目录所有命名以Test开头的Java类。
**/*Test.java:任何子目录下所有命名以Test结尾的Java类。
**/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。

6.Junit (私密)

Junit笔记(Mockito)_sun0322的博客-CSDN博客

---

Java反射学习,Junit中的应用(JMockit)_sun0322的博客-CSDN博客

---

■源码分析 (getBytes()方法 受 file.encode 设定影响的原因)

补充,对于String定义的变量, 取得size时,其实不受到任何影响,String定义的变量,每个字符,是以Unicode编码形式存储的。

文件编码 ANSI、GBK、GB2312、MS936、MS932、SJIS、Windows-31 、EUC-JP 、EBCDIC 等等之间的区别与联系_sun0322的博客-CSDN博客_sjis编码

但是,使用 getBytes()方法时,却会受到影响!

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

。。。

    public byte[] getBytes() {
        return StringCoding.encode(value, 0, value.length);
    }

下面代码第6行 : String csn = Charset.defaultCharset().name();

class StringCoding {

。。。

    static byte[] encode(char[] ca, int off, int len) {
        String csn = Charset.defaultCharset().name();
        try {
            // use charset name encode() variant which provides caching.
            return encode(csn, ca, off, len);
        } catch (UnsupportedEncodingException x) {
            warnUnsupportedCharset(csn);
        }
        try {
            return encode("ISO-8859-1", ca, off, len);
        } catch (UnsupportedEncodingException x) {
            // If this code is hit during VM initialization, MessageUtils is
            // the only way we will be able to get any kind of error message.
            MessageUtils.err("ISO-8859-1 charset not available: "
                             + x.toString());
            // If we can not find ISO-8859-1 (a required encoding) then things
            // are seriously wrong with the installation.
            System.exit(1);
            return null;
        }
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值