7

好吧...我有这个 .txt 文件 (UTF-8)

4661,SOMETHING,3858884120607,24,24.09
4659,SOMETHING1,3858884120621,24,15.95
4660,SOMETHING2,3858884120614,24,19.58

而这段代码

FileInputStream fis = new FileInputStream(new File(someTextFile.txt));
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader in = new BufferedReader(isr);

int i = 0;
String line;
while((line = in.readLine()) != null) {
Pattern p = Pattern.compile(",");
String[] article = p.split(line);

// I don't know why but when a first line starts with
// an integer - article[0] (which in .txt file is 4661)
// becomes someWeirdCharacter4661 so I need to trim it
// *weird character is like |=>|

if (i == 0) {
    StringBuffer articleCode = new StringBuffer(article[0]);
    articleCode.deleteCharAt(0);
    article[0] = articleCode.toString();
}

SomeArticle**.addOrChange(mContext, Integer.parseInt(article[0]), article[1], article[2], Integer.parseInt(article[3]), Double.parseDouble(article[4]));

i++;
}

模拟器上很好,但在真实设备(HTC Desire)上我得到这个(奇怪的)错误:

E/AndroidRuntime(16422): java.lang.NumberFormatException: unable to parse '4661' as integer

有什么问题?

** 这只是我的一些类需要这些参数作为输入(上下文、整数、字符串、字符串、整数、双精度)

4

4 回答 4

7

您的文件可能不是 UTF8 或类似的东西。

但是,如果您想破解一个修复程序,因为您对问题不感兴趣,只是一个解决方案:) 然后去掉任何不是数字或小数点的东西。

String[] article = p.split(line);
Integer i = Integer.parseInt(article[0].replaceAll("[^0-9.]",""));

正则表达式并不完美(例如,它会影响 ...999....),但它会为您服务。

编辑:

我似乎没有正确阅读这个问题。如果它只是在文件的开头,那么很可能你所拥有的是一个字节顺序标记,它用于告诉你文件是否是 unicode 以及在 UTF16/32 中它是小端还是大字节序。您不需要经常看到它使用。

http://unicode.org/faq/utf_bom.html#bom10

于 2011-01-04T22:33:23.780 回答
3

我打算将此添加为评论,但决定也包含一张图片。似乎问题不在于文件不是 UTF-8,但实际上恰恰相反——它似乎是 UTF-8,但它没有被正确读取。

该图像来自一个十六进制编辑器,查看我创建的包含第一行的 UTF-8 文件。请注意 4661 之前的 3 个字符...

替代文字

如果我将文件保存为 ANSI 格式,则这些字符不存在。

于 2011-01-04T23:09:46.110 回答
1

您可以使用 Notepad++,打开您的文本文件,选择菜单 Encoding-->“Encoding in UTF-8 without BOM”并使用此选项保存。编码字节(EF BB BF)将被删除,因此您的代码可以毫无问题地将字符串解析为整数。

希望这有帮助。

于 2013-05-07T15:49:19.090 回答
0

我已将文件转换为 ascii 格式,并在类似的应用程序中正确读取。

于 2013-08-20T21:17:07.763 回答