【问题标题】:Java Applet - Unable to change default platform encoding to some otherJava Applet - 无法将默认平台编码更改为其他一些
【发布时间】:2011-06-07 12:42:47
【问题描述】:

当我尝试上传文件名具有瑞典字符 Ӧ Ӓ å 的文件时,我遇到了编码问题(我猜)。当我在 Windows 上而不是在 Mac OS 上上传文件时,Applet 工作正常。

在服务器端(Domino 服务器)上打印文件名时文件名变得混乱,并在 Mac 上显示框,但是当我将编码设置为 UTF-8 时 new String(filename.getBytes("utf-8")) 它在 Win 和马克。

更新:

以下是sn-ps的代码:

设置请求参数并发布

...
request.setParameter("Name", tmpAtt.getFileName());
...

HttpURLConnection connection ...
connection.setRequestProperty("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + boundary);

if (os == null) os = connection.getOutputStream();

设置文件名和输入流参数

request.setParameter(fileUploadFieldName, tmpAtt.getFilePath(), fi);

public void setParameter(String name, String filename, InputStream is) throws IOException {
    boundary();
    writeName(name);
    write("; charset=utf-8; filename=\"");
    write(filename);
    write('"');
    newline();
    write("Content-Type:");
    String type = connection.guessContentTypeFromName(filename);
    if (type == null) type = "application/octet-stream";
    writeln(type);
    newline();
    pipe(is, os);
    newline();
}

最后发布到服务器

public InputStream post() throws IOException {
    boundary();
    writeln("--");
    printOS(os);
    os.close();
    InputStream iis = connection.getInputStream();
    printIS(iis);
    return iis;
}

在 OutputStream 上写入字节以发送请求时获取此输出。我觉得名字很好。

------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i
Content-Disposition: form-data; name="Name

Räpörå.log
------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i
Content-Disposition: form-data; name="Name2


------------------------------hxre3intl6yy-17eufpccwtxc89pbvyg0iwe3i
Content-Disposition: form-data; name="APPROVALSTATUS

可能是什么问题。

谢谢。

【问题讨论】:

    标签: java encoding applet lotus-domino osx-leopard


    【解决方案1】:

    Java 字符串始终在内部编码为 UTF-16,但这与您的问题无关,并且尝试“设置编码”字符串本质上是错误的。

    编码用于在字符串和字节之间翻译。您的问题是,在完成此操作的某些时候,您没有指定编码,因此 Java 使用平台默认编码。

    由于文件系统 API 是基于字符串的,所以问题不可能出在这端,因此 filename 字符串可能在您从用户那里检索到它时损坏了 - 或者因为存在另一个错误且毫无意义的实例尝试“设置 Java 字符串的编码”。

    eclipse 中的编码设置仅与您的源代码或项目中的其他文件相关。

    【讨论】:

    • 我尝试将其编码为 utf-8 但没有成功,之前我根本没有编码任何东西。文件名字符串的损坏似乎是合乎逻辑的,但是当我在帖子之前打印该值时,它似乎很好。
    • @user330281:问题可能出在文件系统方面。尝试使用命令行参数 -Dfile.encoding=UTF8 运行问题(在 eclipse 运行配置中进行配置)。总而言之,文件名中的非 ASCII 字符似乎仍然存在问题。我最近刚刚注意到,在 Windows PC 和 Linux NAS 之间简单地复制文件时,非 ASCII 文件名会损坏。
    • 谢谢。对不起,我忘了提到我在浏览器中使用小程序,我想我不需要将上述参数放在 eclipse 的运行配置中,浏览器中小程序的解决方法可能是什么。我应该通过将上述参数作为命令 arg 来创建 jar,还是应该是 标记中的参数?另一件事是我正在向多米诺服务器发送请求,希望它不会有任何问题......
    • @user330281:我不认为你可以定义系统属性,但现在看起来你省略了设置中最重要的部分:你根本没有使用 Java 的文件系统 API,是吗? ?如果文件被写入该 domino 服务器,那么实际上最有可能出现问题。
    • @user330281:啊,现在我们到了某个地方。我的猜测是,当您在 HttpRequest 中设置参数时,您最终会以某种方式使用平台默认编码,这就是它依赖于操作系统的原因。或者你的设置方式有问题,或者 Domino 没有正确处理它。我建议您将这部分代码添加到问题中。
    【解决方案2】:

    我刚刚将编码方案更改为ISO-8859-1

    上面提到的write("Content-Type:");方法是这样的:

    1. write(String s){
    2. os.write(s.getBytes());
    3. }
    

    我刚刚将第二行改为os.write(s.getBytes("ISO-8859-1"))

    它对UTF-8不起作用,我不知道为什么???

    该方案在某处更改为MacRoman,因为当我将ISO-8859-1 模式添加到此(如上所述)行request.setParameter("Name", new String(tmpAtt.getFileName().getBytes("ISO-8859-1"))); 时,Name 最后出现乱码。

    但我不明白为什么 UTF-8 不起作用,为什么中间的某个地方改变了方案???

    谢谢你

    【讨论】:

    • new String() 使用平台默认编码。正如我所说:试图将 Java 字符串“转换”为不同的编码是根本错误的。至于为什么 UTF-8 不起作用:文件名是作为请求的 HTTP 标头的一部分发送的,而 HTTP 标头是标准规定的隐式 ISO-8859-1。因此,您更改后的 write() 方法现在符合标准。
    猜你喜欢
    • 2020-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2016-01-14
    • 2020-07-12
    • 2011-05-18
    • 2013-10-18
    相关资源
    最近更新 更多