Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有重音字符的URLConnection编码问题_Java_Url - Fatal编程技术网

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();
My
prepareData.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个字节将创建前者的组合。