码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Maven ,命令行中,字符编码 设置


    目录

    ■前言(遇到的问题)

    ■具体操作 (尝试命令行设置 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} -Xmx1024m -Dfile.encoding=UTF-8

    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. }

  • 相关阅读:
    java计算机毕业设计ssm基金分析系统的设计与实现
    git stash 是一个在Git中用于保存当前工作目录和暂存区的临时状态的命令
    2022年的有关语义分割的论文,含CVPR、ECCV、ICLR、AAAI
    网络编程day03(UDP中的connect函数、tftp)
    图像处理之LSB替换隐写算法的实现
    Matebook13右侧USB-C/Type-C接口无法识别
    使用MitmProxy离线缓存360度全景网页
    pandas使用index参数为Series数据指定时间对象索引(DatetimeIndex)、使用datetime包创建索引时间数据
    原生Js 提取视频中的音频
    基于Python实现的特征选择的遗传算法(GA)
  • 原文地址:https://blog.csdn.net/sxzlc/article/details/127115772
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号