我有问题通过FTP将文件上传到我的服务器。该文件是一个json文件,我读得很好,没有符号。这是我上传文件的代码:
public static void subir(){
String server = server;
int port = 21;
String user = user;
String pass = pass;
FTPClient ftpClient = new FTPClient();
ftpClient.setControlEncoding("UTF-8");
try {
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
// Uploads first file using an InputStream
File firstLocalFile = new File("my.json");
String firstRemoteFile = "Folder/my.json";
InputStream inputStream = new FileInputStream(firstLocalFile);
System.out.println("Subiendo archivo a servidor...");
boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
inputStream.close();
if (done) {
System.out.println("great");
}
} catch (IOException ex) {
System.out.println("Error: " + ex.getMessage());
ex.printStackTrace();
} finally {
try {
if (ftpClient.isConnected()) {
ftpClient.logout();
ftpClient.disconnect();
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
问题是,当我打开包含我文件的网址时,我会用符号读取我的信息,例如parecÃa而不是parecía,Giménez而不是Giménez。有人能帮助我吗?感谢
我手动创建了json:
sBuffer = new StringBuffer();
a= "{\"results\":[";
sBuffer.append(a);
for (int z=0; z< myarray.size(); z++){
if (z<(myarray.size()-1)){
b="{\"one\":\""+ myarray.get(z).getOne()+"\",\"twoo\":\""+ myarray.get(z). getTwoo()+"\",\"three\":\""+ myarray.get(z).getThree()+"\"},";
sBuffer.append(b);
}
else{
c="{\"one\":\""+ myarray.get(z). getOne()+"\",\"twoo\":\""+ myarray.get(z).getTwoo()+"\",\"three\":\""+myarray.get(z). getThree()+"\"}]}";
sBuffer.append(c);
}
}
答案 0 :(得分:0)
总结我的评论:
包含不在ASCII范围内的字符的JSON文件(如é
或ñ
)可以用两种方式表示:
纯ASCII文件。所有&#34;特别&#34;字符由unicode转义序列表示。例如,é
将表示为\u00E9
。 ñ
是\u00F1
。文件中的数据实际上是字符\
,u
,0
,0
,F
,1
,但任何好的JSON解释器将读取并将其内部转换为正确的字符。
编码文件。 &#34;特别&#34;根据您保存的特定编码,字符由8位字节表示。如果您选择UTF-8,则é
文件中保存的实际字节为0xC3
0xC9
。对于ñ
,字节为0xC3
0xB1
。这就是UTF-8编码的工作原理 - 每个&#34;特殊&#34;字符由两个或多个8位字节表示。
现在您已经创建了一个UTF-8文件并将其成功放置在服务器上 。它是成功的,因为您使用二进制传输方法,这意味着它不进行任何编码,只是将字节完全按原样传递给服务器。
问题是你如何阅读数据。
每个HTTP URL在响应请求时,会发送一个标题,告诉浏览器或程序读取它返回的响应类型,字符的编码是。< / p>
例如,如果URL发送标题:
Content-type: text/html; charset="ISO-8859-1"
然后浏览器或阅读程序知道(a)此文件包含HTML格式的文本数据,以及(b)其字符编码为ISO-8859-1
。
如果URL发送标题:
Content-type: text/plain; charset="UTF-8"
然后浏览器或阅读程序知道(a)此文件包含没有特定格式的文本,(b)其字符编码为UTF-8
。
在您的情况下,问题是URL提供以UTF-8编码的文件。但它的标题表示内容类型为ISO-8859-1
。
这意味着当浏览器看到浏览器发送的字节序列C3
A9
时,它应该是é
,它会根据{{1}来解释它们编码。在该编码中,每个字节都是一个单独的字符。 ISO-8859-1
C3
实际为Ã
,ISO-8859-1
为A9
。因此,您在浏览器中看到的内容是©
,而不是é
。发送的数据是相同的字节序列。该文件未更改。但由于标题,您的浏览器/阅读器在内部对其进行了转换,并将其显示为不同的字符。
你是如何解决这个问题的?
创建文件时,使用转义序列é
创建文件。无论HTTP响应的编码是\uXXXX
,US-ASCII
编码还是ISO-8859
,都可以使用。
URL由某种Web程序操作:servlet,PHP脚本或其他东西。该程序应该发送正确的UTF-8
标题,当然不是Content-type
。 JSON的正确内容类型应为ISO-8859-1
。如果发送它,则不需要设置字符集,因为您只对application/json
编码执行此操作,而不是对text/*
进行字节流编码。像Firefox这样的常规浏览器可能会或可能不会理解,但是应该读取JSON URL的程序应该理解这一点,并自动将JSON数据解释为UTF-8。但是,如果这不起作用(因为您实际上是使用某些文本工具或Internet Explorer查看数据,而不是特定于JSON的数据),则可以将标头设置为application/*
,或{{1} }。
请注意,如果您要访问text/plain; charset="UTF-8"
等直接网址,则表示网络服务器(apache,IIS,无论如何)根据text/javascript; charset="UTF-8"
后缀的配置设置设置标头。在这种情况下,您必须更改该后缀的服务器配置。
要在创建JSON文件时以编程方式将字符串转换为转义格式,您可以执行以下操作之一(按从最好到最差的顺序):
StringEscapeUtils
。使用此类方法将字符串的字符附加到http://server/folder/file.json
:
.json