所以,我有一个真正困扰我的问题。我有一个简单的解析器,我在java中。以下是相关代码:
while( (line = br.readLine())!=null)
{
String splitted[] = line.split(SPLITTER);
int docNum = Integer.parseInt(splitted[0].trim());
//do something
}
输入文件是CSV文件,文件的第一个条目是整数。当我开始解析时,我会立即得到这个例外:
Exception in thread "main" java.lang.NumberFormatException: For input string: "1"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at dipl.parser.TableParser.parse(TableParser.java:50)
at dipl.parser.DocumentParser.main(DocumentParser.java:87)
我检查了文件,确实有1作为它的第一个值(该字段中没有其他字符),但我仍然收到消息。我认为这可能是因为文件编码:它是UTF-8,带有Unix端线。该程序在Ubuntu 14.04上运行。欢迎任何建议在哪里寻找问题。
答案 0 :(得分:36)
你的号码前面有一个BOM;如果我在您的问题中复制了"1"
的内容并将其粘贴到vim
,我会看到前面有一个FE FF(例如,BOM)。从那个链接:
构成BOM的确切字节将是通过该转换格式转换为Unicode字符U + FEFF的任何内容。
这就是问题所在,使用适当的读取器使用该文件进行转换(UTF-8,UTF-16 big-endian,UTF-16 little-endian等)文件编码。有关使用Java读取Unicode文件的更多信息,另请参阅this question and its answers。