Java 带有重音字符的URLConnection编码问题
我在尝试发送文本时遇到了Java 带有重音字符的URLConnection编码问题,java,url,Java,Url,我在尝试发送文本时遇到了URLConnection编码问题 我的代码是: final URL url = new URL(urlString); final URLConnection urlConnection = url.openConnection(); urlConnection.setDoInput(true); urlConnection.setDoOutput(true); urlConnection.setUseCaches(false); urlConnection.setRe
URLConnection
编码问题
我的代码是:
final URL url = new URL(urlString);
final URLConnection urlConnection = url.openConnection();
urlConnection.setDoInput(true);
urlConnection.setDoOutput(true);
urlConnection.setUseCaches(false);
urlConnection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
urlConnection.setRequestProperty("Accept-Charset", "UTF-8");
final DataOutputStream urlDataOut = new DataOutputStream(urlConnection.getOutputStream());
urlDataOut.writeBytes(prepareData.toString());
urlDataOut.flush();
urlDataOut.close();
MyprepareData.toString()
包含带“è”的单词,一旦写入urlDataOut,它将包含带问号的菱形,而不是“è”字母,写入状态为失败
有人知道如何面对这个问题吗?这种方法不适合任何字符编码。它的文件说:
字符串中的每个字符都是通过丢弃其高8位按顺序写出的
使用方法writeUTF
也不可行。它写入两个字节,其中包含编码的字符串的长度(字节数),服务器将在开始时将其解释为字符
因此,您应该使用将文本写入输出流的标准方式:
Writer w=new OutputStreamWriter(
urlConnection.getOutputStream(), StandardCharsets.UTF_8);
w.write(prepareData.toString());
w.flush();
w.close();
该方法不适用于任何字符编码。它的文件说:
字符串中的每个字符都是通过丢弃其高8位按顺序写出的
使用方法writeUTF
也不可行。它写入两个字节,其中包含编码的字符串的长度(字节数),服务器将在开始时将其解释为字符
因此,您应该使用将文本写入输出流的标准方式:
Writer w=new OutputStreamWriter(
urlConnection.getOutputStream(), StandardCharsets.UTF_8);
w.write(prepareData.toString());
w.flush();
w.close();
您可以尝试urlDataOut.writeUTF(prepareData.toString())
?您要在哪里打印此文件?到控制台?您应该阅读您是否可以尝试urlDataOut.writeUTF(prepareData.toString())
?您要在哪里打印此文件?到控制台?你应该读Hi Holger,谢谢你的回复。我测试了DataOutputStream.writeUTF,它成功了,我不能使用StandardCharsets.UTF_8,因为我没有使用Java 7。您只需使用“UTF-8”
(字符串
)即可。它将查找字符集,并保证不会因UTF-8
字符集而失败。writeUTF
只要写入的字节数构成服务器可忽略的字符,就可以工作。但是写不同长度的文本可能会使它突然中断,产生不可忽略甚至无效的UTF-8
字节。@霍尔格,你能详细说明一下“只要写的字节数构成服务器可忽略的字符,writeUTF就可以工作。”你指的是超过两个字节的字符吗,writeUTF
将字节数写入字符前的big-endian 2字节数。此数字将被不需要此数字的接收者解释为字符。如果字节数低于32,则标头由一个0
字节和一个控制字符组成,两者都很可能被忽略。如果字节计数大于32,您可能会在字符串前面看到一个虚假的可打印字符,但如果它介于128和255之间,则将形成一个字节,从而创建一个无效的UTF-8
序列。写入超过256字节将创建前者的组合。嗨,霍尔格,谢谢你的回复。我测试了DataOutputStream.writeUTF,它成功了,我不能使用StandardCharsets.UTF_8,因为我没有使用Java 7。您只需使用“UTF-8”
(字符串
)即可。它将查找字符集,并保证不会因UTF-8
字符集而失败。writeUTF
只要写入的字节数构成服务器可忽略的字符,就可以工作。但是写不同长度的文本可能会使它突然中断,产生不可忽略甚至无效的UTF-8
字节。@霍尔格,你能详细说明一下“只要写的字节数构成服务器可忽略的字符,writeUTF就可以工作。”你指的是超过两个字节的字符吗,writeUTF
将字节数写入字符前的big-endian 2字节数。此数字将被不需要此数字的接收者解释为字符。如果字节数低于32,则标头由一个0
字节和一个控制字符组成,两者都很可能被忽略。如果字节计数大于32,您可能会在字符串前面看到一个虚假的可打印字符,但如果它介于128和255之间,则将形成一个字节,从而创建一个无效的UTF-8
序列。写入超过256个字节将创建前者的组合。