0

我有一个将 xml 文件发送到服务器的 Android 应用程序。如果我将 xml 标头的编码设置为 utf-8,则一切正常,直到出现像日本符号这样的奇怪字符,在这种情况下,服务器拒绝 xml,因为它不是 utf-8。我无法控制服务器的工作方式,但它是一个成熟的产品,所以它不是任何东西。

在发送 xml 之前,我将包含它的字符串打印到终端,并且所有字符都正确显示。

我怎么知道我创建的字符串是否真的是 utf-8,如果是,我如何通过套接字将它作为 utf-8 发送。

这就是我将文件读入字符串的方式:

file = new File (filePath);
FileReader fr = new FileReader (file);
BufferedReader br = new BufferedReader(fr);

// Reading the file
String line;
while((line=br.readLine())!=null)
data += line + '\n';
br.close();

这就是我发送字符串的方式

Socket socketCliente = new Socket();

try {
  socketCliente.connect(new InetSocketAddress(address, port), 2000);
} catch (UnknownHostException e) {
      getError("Host doesn't exist");
  return -1;
} catch (IOException e) {
  getError("Could not connect: The host is down");
  return -1;
}

DataOutputStream serverOutput = null;

try {
  serverOutput = new DataOutputStream(socketCliente.getOutputStream());
} catch (IOException e1) {
  getError("Could not get Data output stream");
}

try {
serverOutput.writeBytes(data);
} catch (IOException e) {
getError("Could not write on server");
}

如果我在发送之前打印“数据”字符串,所有字符都会正确显示。

我尝试了无数种不同的方式来读取字符串并以不同的方式写入套接字,但它们要么没有区别,要么完全阻止 xml 被接受,即使使用标准字符也是如此。

已解决:我不是从文件读取到字符串,而是读取到字节数组然后发送它。

file = new File(filePath);
    int size = (int) file.length();
    data = new byte[size];
    try {
         BufferedInputStream buf = new BufferedInputStream(new FileInputStream(file));
         buf.read(data, 0, data.length);
         buf.close();
    } catch (FileNotFoundException e) {
         getError("File not found");
    } catch (IOException e) {
         getError("Could not read from file");
    }
4

1 回答 1

0

Java 通常使用 UTF-16 进行编码。具体来说,要使用 UTF-8,您应该使用InputStreamReader(带有FileInputStream)和PrintWriter(带有套接字的OutputStream),并使用允许您指定所需字符集的构造函数变体(在本例中为 UTF-8) .

如果您在应用程序中使用Guava,您可以使用几个实用程序来帮助解决此问题,包括 Files.newReader() 和 ByteStreams.copy()。

于 2013-05-17T07:10:36.387 回答