当前位置:   article > 正文

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

mvn 指定编码

目录

■前言(遇到的问题)

■具体操作 (尝试命令行设置 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得到的结果不一样

模拟代码

  1. package com.sxz.test;
  2. public class TestEncode {
  3. public static void main(String[] args) {
  4. // TODO Auto-generated method stub
  5. String str = "ア"; // 实际程序中, 设置是变量
  6. int length = str.getBytes().length;
  7. System.out.println(length); // 实际程序中, length 作为逻辑判断使用
  8. }
  9. }

(日语中,半角 ア

     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>

  1. <plugin>
  2.     <groupId>org.apache.maven.plugins</groupId>
  3.     <artifactId>maven-surefire-plugin</artifactId>
  4.     <version>2.22.1</version>
  5.     <configuration>
  6.         <argLine>${argLine} -Xmx1024m -Dfile.encoding=UTF-8</argLine>
  7.         <!--<skipTests>true</skipTests>-->
  8.     </configuration>
  9. </plugin>

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

  1. × <argLine>${argLine} -Xmx1024m -Dfile.encoding=EUC-JP</argLine>
  2. <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代码中检测操作系统语言(语言环境)

  1. import java.util.Locale;
  2. import java.nio.charset.Charset;
  3. ...
  4. System.getProperty( Locale.getDefault() );
  5. System.getProperty( System.getProperty("user.country") );
  6. System.getProperty( System.getProperty("user.language") );
  7. System.out.println(System.getProperties().get("file.encoding"));
  8. System.out.println(Charset.defaultCharset());

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

java -Dfile.encoding=UTF-8 TestEncode

Linux 查看系统环境语言命令

locale

  1. sxz001@sxzap01:~$ locale
  2. LANG=ja_JP.UTF-8
  3. LANGUAGE=
  4. LC_CTYPE="ja_JP.UTF-8"
  5. LC_NUMERIC="ja_JP.UTF-8"
  6. LC_TIME="ja_JP.UTF-8"
  7. LC_COLLATE="ja_JP.UTF-8"
  8. LC_MONETARY="ja_JP.UTF-8"
  9. LC_MESSAGES="ja_JP.UTF-8"
  10. LC_PAPER="ja_JP.UTF-8"
  11. LC_NAME="ja_JP.UTF-8"
  12. LC_ADDRESS="ja_JP.UTF-8"
  13. LC_TELEPHONE="ja_JP.UTF-8"
  14. LC_MEASUREMENT="ja_JP.UTF-8"
  15. LC_IDENTIFICATION="ja_JP.UTF-8"
  16. LC_ALL=
  17. sxz001@sxzap01:~$

---

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

  1. ・读取文件
  2. FileInputStream fis=new FileInputStream(“xxxx.txt”);
  3. ・写文件
  4. 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/)

  1. 下所有符合一组命名模式的测试类。这组模式为:
  2. **/Test*.java:任何子目录所有命名以Test开头的Java类。
  3. **/*Test.java:任何子目录下所有命名以Test结尾的Java类。
  4. **/*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()方法时,却会受到影响!

  1. public final class String
  2. implements java.io.Serializable, Comparable<String>, CharSequence {
  3. 。。。
  4. public byte[] getBytes() {
  5. return StringCoding.encode(value, 0, value.length);
  6. }

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

  1. class StringCoding {
  2. 。。。
  3. static byte[] encode(char[] ca, int off, int len) {
  4. String csn = Charset.defaultCharset().name();
  5. try {
  6. // use charset name encode() variant which provides caching.
  7. return encode(csn, ca, off, len);
  8. } catch (UnsupportedEncodingException x) {
  9. warnUnsupportedCharset(csn);
  10. }
  11. try {
  12. return encode("ISO-8859-1", ca, off, len);
  13. } catch (UnsupportedEncodingException x) {
  14. // If this code is hit during VM initialization, MessageUtils is
  15. // the only way we will be able to get any kind of error message.
  16. MessageUtils.err("ISO-8859-1 charset not available: "
  17. + x.toString());
  18. // If we can not find ISO-8859-1 (a required encoding) then things
  19. // are seriously wrong with the installation.
  20. System.exit(1);
  21. return null;
  22. }
  23. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/43864
推荐阅读
相关标签
  

闽ICP备14008679号