扫描仪难以使用不同的转义字符

时间:2017-01-11 20:45:20

标签: java escaping java.util.scanner java-io

首先让我先说我知道我不是唯一经历过这个问题的人,我花了最后几个小时来研究如何解决这个问题。可悲的是,我无法让我的扫描仪工作。我是java的新手,所以我不理解一些答案在不同问题上有更复杂的解释。

这是一个纲要: 我正在尝试读出一个包含卡片转义字符的文件。这是一个简短的版本:( 4个不同卡面的数字2和3)

\u26602,2 
\u26652,2 
\u26662,2 
\u26632,2 
\u26603,3 
\u26653,3 
\u26663,3
\u26633,3

这是格式:(套装)(面部),(值)。一个例子:

  • \ u2663 = suit
  • 3 =面对
  • 3 =值

这是我用来阅读它的代码:

File file = new File("Cards.txt");
try {
    Scanner scanner = new Scanner(file);
    while (scanner.hasNextLine()) {
        String line = scanner.nextLine();
        String[] temp = line.split(",");
        cards.add(new Card(temp[0], Integer.parseInt(temp[1])));
    }
    scanner.close();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
在此之后,ArrayList卡应该有52张卡,其中包含一个名称(套装和面部)和一个值。当我尝试打印名称时,这是输出:

\u26633

虽然它应该是:

♣3

任何人都可以指点解决方案吗?我真的需要解决这个问题。我不希望你为我编写代码。

提前致谢

2 个答案:

答案 0 :(得分:3)

只需将套装字符直接存储到文件Cards.txt中,使用UTF-8作为字符编码,而不是只有java才能理解的相应的unicode字符格式,以便从文件中读取时将其读取为String" \u2660"不是相应的unicode字符。

其内容将类似于:

♠2,2
...

另一种方法是使用StringEscapeUtils.unescapeJava(String input)来取消你的unicode角色。

代码更改将是:

cards.add(new Card(StringEscapeUtils.unescapeJava(temp[0]), Integer.parseInt(temp[1])));

答案 1 :(得分:0)

您必须使用UTF-8编码保存文件,然后使用相同的编码读取文件。

  

♥,1

     

♥,2

     

♥,3

以下是代码段:

BufferedReader buff = new BufferedReader(new InputStreamReader(
        new FileInputStream("Cards.txt"), "UTF-8"));

String input = null;
while (null != (input = buff.readLine())) {
    System.out.println(input);
    String[] temp = input.split(",");
    cards.add(new Card(temp[0], Integer.parseInt(temp[1])));
}

buff.close();

此外,您需要确保启用控制台以支持UTF-8。请查看this答案以了解更多信息。