我正在练习在file.The 10中使用命令行运行java脚本。java脚本使用scanner(System.in)从文件中获取输入,并打印它从windows powershell命令中获得的字符串,如下所示:
Get-Content source.txt | java test.TestPrintsource.txt文件的内容如下:
:
a
2
!TestPrint.java文件如下:
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的结果是
?:
a
2
!您看,当我将source.txt文件第一行的字符从":“改为"a”时,它会在第一个line.Then的请求中添加问号,结果是
a
a
2
!它为第一行的请求增加了空间。
我对字符进行了测试,发现了规律性:如果字符大于ASCII码中的"?",即ASCII码中的63,则会添加空格,如"A"(ASCII码中为65)或"["(ASCII码中为91).If字符小于"?",包括"?“本身,它将添加问号。
发布于 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或十几行您自己的代码来完成此任务。
同样,从了解文本文件的字符编码开始,并将该元数据作为参数插入到处理中。
发布于 2019-04-02 23:26:33
这会不会是Unicode的问题(参见:Java Unicode problems)?例如,尝试指定您想要读取的类型:
Scanner in = new Scanner(System.in, "UTF-8");编辑:
根据进一步的研究,Windows5.1和更早版本的默认代码页是PowerShell -1252。PowerShell 6+和跨平台版本已切换到UTF-8。因此(从注释中)您可能需要指定Windows-1252编码:
Scanner in = new Scanner(System.in, "Windows-1252");要找出使用的是什么编码,请在PowerShell中执行以下命令:
[System.Text.Encoding]::Default您应该能够看到使用的是什么编码(对于我来说,在Windowsv5.1中使用的是PowerShell -1252,对于PowerShell 6来说,使用的是UTF8)。
https://stackoverflow.com/questions/55478203
复制相似问题