为什么Java的BufferedReader不会像Objective-C的NSData那样?

时间:2013-03-04 11:23:48

标签: java objective-c encoding nsdata bufferedreader

我正在开发一个在Android和iOS设备上运行的应用程序。对于这个应用程序,我需要从URL获取XML流。这个XML并不安全,因为有些行,例如:

  

Révélation

将成为:

  

Rvlation

当然我知道最好的办法是修复XML生成器脚本。但我只是作为一家公司的开发人员而无法访问它,所以目前我正在努力做我能做的事情。

现在这就是本主题的原因。当我将这些数据放在Objective-C的NSData对象中时:

NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];

然后尝试读取每个字节:

NSUInteger len = [data length];
Byte *byteData = (Byte*)malloc(len);
memcpy(byteData, [data bytes], len);
for(int i = 0 ; i < len ; i++)
{
    NSLog(@"%d",byteData[i]);
}

它正确显示char的int值,特殊字符。然后我只需要处理(unichar)byteData[i]来解决它。

没有Java和Android,我正在尝试做一个基本的BufferedReader操作。

URL myURL = new URL(url);
BufferedReader in = new BufferedReader(new InputStreamReader(myURL.openStream()));

然后逐个打印每个char的int:

int i;
while((i = in.read()) != -1) System.out.print(i);

但是使用Java,通过这样做,我立即得到替换char的id(65533)而不是好的id,并且无法设法替换它。

有什么想法吗?谢谢你的阅读。

1 个答案:

答案 0 :(得分:6)

BufferedReader in = new BufferedReader(
        new InputStreamReader(myURL.openStream(), "UTF-8"));
  • InputStreams 用于字节,二进制数据。

  • 读者适用于字符,字符串,文字。

InputStreamReader桥接了这个概念上的差异,说明二进制数据的编码是什么,并且具有编码的可选参数。默认编码是当前平台的编码 - 因此不太便携。