我正在开发一个在 Android 和 iOS 设备上运行的应用程序。对于这个应用程序,我需要从 URL 获取 XML 流。这个 XML 并不是很安全,因为有些行,例如:
Révélation
将变成:
R�v�lation
当然 我知道最好的办法是修复 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()));
然后一个一个打印每个字符的整数:
int i;
while((i = in.read()) != -1) System.out.print(i);
但是对于 Java,这样做我会立即得到替换字符的 id (65533) 而不是好的 id,并且无法替换它。
有什么想法吗?感谢您阅读我。
最佳答案
BufferedReader in = new BufferedReader(
new InputStreamReader(myURL.openStream(), "UTF-8"));
InputStreams 用于字节、二进制数据。
Readers 用于字符、字符串、文本。
InputStreamReader 弥合了这种概念上的差异,说明二进制数据采用哪种编码方式, 并且有一个可选的编码参数。默认编码是当前平台的编码 - 所以不是很便携。
关于java - 为什么 Java 的 BufferedReader 不像 Objective-C 的 NSData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15200414/