为什么String.split("£",2)不起作用?

Sim*_*age 4 java regex string split

我有一个1000行的文本文件,格式如下:

19 x 75 Bullnose Architrave/Skirting £1.02 
Run Code Online (Sandbox Code Playgroud)

我正在编写一个逐行读取文件的方法 - 这个工作正常.

然后,我想使用"£"作为分隔符拆分每个字符串,并按ArrayList<String>以下格式写出:

19 x 75 Bullnose Architrave/Skirting, Metre, 1.02
Run Code Online (Sandbox Code Playgroud)

这就是我接近它的方式(productListArrayList在try块之外声明/实例化):

try{
    br = new BufferedReader(new FileReader(aFile));
    String inputLine = br.readLine();
    String delim = "£";

    while (inputLine != null){
        String[]halved = inputLine.split(delim, 2);
        String lineOut = halved[0] + ", Metre, " + halved[1];//Array out of bounds
        productList.add(lineOut);

        inputLine = br.readLine();
    }
}
Run Code Online (Sandbox Code Playgroud)

字符串没有分裂,我一直在得到ArrayIndexOutOfBoundsException.我对正则表达式不太熟悉.我也试过使用旧的StringTokenizer但得到相同的结果.

£作为一个delim 存在问题还是其他问题?我确实想知道这是否与第二个令牌没有被读作是有关系的String

任何想法都会有所帮助.

Ste*_*n C 6

以下是一些可能的原因:

  • 该文件的编码与您用于读取它的编码不匹配,文件中的"磅"字符被"损坏"为其他内容.

  • 该文件和您的源代码使用不同的磅字符.例如,Unicode有两个看起来像"英镑符号"的代码点 - 英镑字符(00A3)和里拉字符(2084)......然后是罗马semuncia字符(10192).

  • 您正在尝试编译UTF-8编码的源文件,而不告诉编译器它是UTF-8编码的.


从您的评论来看,这是一个编码不匹配的问题; 即Java使用的"默认"编码与文件的实际编码不匹配.有两种方法可以解决这个问题:

  • 更改文件的编码以匹配Java的默认编码.你似乎已经尝试过但失败了.(这不会是我这样做的方式......)

  • 更改程序以使用特定(非默认)编码打开文件; 例如改变

    new FileReader(aFile)
    
    Run Code Online (Sandbox Code Playgroud)

    new FileReader(aFile, encoding)
    
    Run Code Online (Sandbox Code Playgroud)

    其中encoding是文件的实际字符编码的名称.这里列出了Java理解的编码名称,但我的猜测是它是"ISO-8859-1"(又名Latin-1).