首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用powershell中的Get-Content作为java输入获取额外的字符

使用powershell中的Get-Content作为java输入获取额外的字符
EN

Stack Overflow用户
提问于 2019-04-02 23:16:54
回答 2查看 624关注 0票数 1

我正在练习在file.The 10中使用命令行运行java脚本。java脚本使用scanner(System.in)从文件中获取输入,并打印它从windows powershell命令中获得的字符串,如下所示:

代码语言:javascript
复制
Get-Content source.txt | java test.TestPrint

source.txt文件的内容如下:

代码语言:javascript
复制
:
a
2
!

TestPrint.java文件如下:

代码语言:javascript
复制
package test;

import java.util.Scanner;

public class TestPrint {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);

        while(in.hasNextLine())
        {
            String str = in.nextLine();
            if(str.equals("q")) break;
            System.out.println( str );          
        }
    }

}

然后奇怪的是happed.The的结果是

代码语言:javascript
复制
?:
a
2
!

您看,当我将source.txt文件第一行的字符从":“改为"a”时,它会在第一个line.Then的请求中添加问号,结果是

代码语言:javascript
复制
 a
a
2
!

它为第一行的请求增加了空间。

我对字符进行了测试,发现了规律性:如果字符大于ASCII码中的"?",即ASCII码中的63,则会添加空格,如"A"(ASCII码中为65)或"["(ASCII码中为91).If字符小于"?",包括"?“本身,它将添加问号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-04 14:23:03

没有文本,只有编码的文本。

读取文本文件或流的每个程序都必须知道并使用与编写器使用的相同的字符编码。

自适应默认字符编码是70年代和80年代问题的90年代解决方案(大约)。现在,最好避免使用使用默认值的构造函数和方法,在PowerShell中,在需要控制输入或输出的地方添加编码参数。

为了防止数据丢失,您可以始终使用Unicode字符集。UTF-8对于文件和流来说是最常见的。(PowerShell和Java将UTF-16用于文本数据类型。)

但是您需要从您所知道的文本文件的字符编码开始。如果你不知道这个元数据,那就是数据丢失。

Unicode规定,如果已知文件或流是Unicode,则可以从称为BOM的元数据开始。BOM指示正在使用的特定Unicode字符编码以及字节顺序(对于代码单位长于一个字节的字符编码)。这一规定并没有解决我所见过的任何问题,而是导致了它自己的问题。

(在抽象级别,字符编码是代码点和代码单元之间的映射,因此与字节顺序无关。在实践中,字符编码采取额外的步骤,将代码单元序列化为字节序列,或将代码单元反序列化为字节序列。因此,有时使用或不使用BOM包含在编码的名称或描述中。BOM也可能被称为签名。因此,“带签名的UTF-8。”)

作为元数据,BOM (如果存在)应该在需要时使用,并在将文本放入文本数据类型时始终丢弃。不幸的是,Java的标准库不会丢弃BOM。您可以使用popular libraries或十几行您自己的代码来完成此任务。

同样,从了解文本文件的字符编码开始,并将该元数据作为参数插入到处理中。

票数 0
EN

Stack Overflow用户

发布于 2019-04-02 23:26:33

这会不会是Unicode的问题(参见:Java Unicode problems)?例如,尝试指定您想要读取的类型:

代码语言:javascript
复制
Scanner in = new Scanner(System.in, "UTF-8");

编辑:

根据进一步的研究,Windows5.1和更早版本的默认代码页是PowerShell -1252。PowerShell 6+和跨平台版本已切换到UTF-8。因此(从注释中)您可能需要指定Windows-1252编码:

代码语言:javascript
复制
Scanner in = new Scanner(System.in, "Windows-1252");

要找出使用的是什么编码,请在PowerShell中执行以下命令:

代码语言:javascript
复制
[System.Text.Encoding]::Default

您应该能够看到使用的是什么编码(对于我来说,在Windowsv5.1中使用的是PowerShell -1252,对于PowerShell 6来说,使用的是UTF8)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55478203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档