OSX 上的 Java 7 使用 jnlp/webstart 时出现文件名编码问题

2024-05-28

我遇到了这个问题,经过几天的搜索和解决方法尝试均未成功。

我现在有一个由 jnlp/webstart 分发的内部 java swing 程序,在 osx 和 windows 计算机上,除其他外,它还从 WebDav 下载一些文件。

最近,在装有 OSX 10.8 和 Java 7 的测试机器上,带有重音字符的文件名和目录名开始被问号替换。

在 Java 7 之前的 OSX 上没有问题。

例子 :

XXXYYY_è_ABCD/

becomes

XXXYYY_?_ABCD/

using java.text.Normalizer(NFD, NFC, NFKD, NFKC) 在原始字符串上,结果不同但仍然错误:

XXXYYY_e?_ABCD/

or

XXXYYY_e_ABCD/

我从 [oracle.com 的 andrew.brygin] 和 [gmail.com 的 mik3hall] 之间的通信中知道

是的,file.encoding 是根据 jvm 运行的语言环境设置的 上,如果您在 xxxx.UTF-8 语言环境中运行 java vm,则 file.encoding应该是UTF-8,设置为MacRoman会有问题。 所以我相信 Oracle/OpenJDK7 行为正确。也就是说,正如安德鲁 Thompson 指出,如果所有以前的 Apple JDK 版本都使用 MacRoman 作为 english/UTF-8 语言环境的 file.encoding,有一个 这里的“兼容性”问题,可能值得在其中添加一些内容 发布说明,供 Oracle/OpenJDK MacOS 用户注意。

原始邮件 http://mail.openjdk.java.net/pipermail/macosx-port-dev/2012-May/004290.html

from 乔尼·萨洛宁 https://stackoverflow.com/users/318758/joni?tab=summary blog (java 和带有无效字符的文件名 http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/) 我知道 :

您可能知道 Java 使用“默认字符编码”来 将二进制数据转换为字符串。使用其他人读取或写入文本 编码您可以使用InputStreamReader或OutputStreamWriter。但 对于 API 深处的数据到文本转换,您别无选择,只能 更改默认编码。

and

文件编码怎么样?

file.encoding 系统属性也可用于设置默认值 Java 用于 I/O 的字符编码。不幸的是,似乎 对文件名如何解码为字符串没有影响。

从 jnlp 内部执行 locale 总是打印

LANG=
LC_COLLATE="C"
LC_CTYPE="C"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

stackoverflow 上最相似的问题及其解决方案是这样的:java-7-os-x 中文件名的编码问题 https://stackoverflow.com/questions/12987252/file-list-retrieves-file-names-with-non-ascii-characters-incorrectly-on-mac-os

但解决方案是将 java 程序的执行包装在脚本中

#!/bin/bash
export LC_CTYPE="UTF-8" # Try other options if this doesn't work
exec java your.program.Here

但由于网络启动,我认为此选项对我不可用,并且我还没有找到任何方法来从程序内设置 LC_CTYPE 环境变量。

有什么解决方案或解决方法吗?

P.S. :

如果我们直接从 shell 运行该程序,即使在 OSX 10+Java 7 上它也能正确写入文件/目录。 仅JNLP+OSX+Java7组合时出现该问题


我认为文件名的最大 ASCII 表示是可以接受的,它几乎适用于任何编码。

首先,您要专门使用 NFKD,以便以 ASCII 形式保留最大信息。例如,"2⁵"变成"25"而不仅仅是"2", "fi"变成"fi"而不是""等等,一旦非 ASCII 和非控制字符被过滤掉。

String str = "XXXYYY_è_ABCD/";
str = Normalizer.normalize(str, Normalizer.Form.NFKD);
str = str.replaceAll( "[^\\x20-\\x7E]", "");
//The file name will be XXXYYY_e_ABCD no matter what system encoding

然后,您始终将文件名传递给此过滤器以获取其文件系统名称。你只会失去一些独特性,即文件asdé.txt是一样的 作为asde.txt并且在这个系统中它们无法被区分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OSX 上的 Java 7 使用 jnlp/webstart 时出现文件名编码问题 的相关文章

  • 为什么在Java中读取易失性和写入字段成员是不可扩展的?

    观察以下用 Java 编写的程序 完整的可运行版本如下 但程序的重要部分在下面的代码片段中 import java util ArrayList A not easy to explain benchmark class MultiVola
  • 从 ArrayList Java 中的 HashMap 键中检索所有值

    美好的一天 这让我现在有点困惑 大脑冻结 并且似乎遗漏了一些东西 有一个 ArrayList 我用 HashMap 填充它 现在我放入 HashMap 和 arraylist Map put DATE value1 Map put VALU
  • 限制执行第三方软件的线程的权限

    我正在开发一个基于 Eclipse 的应用程序 能够执行第三方组件 不是 eclipse plugin 每个组件都有一个列出权限 以及相应动机 的自定义描述符 这样最终用户可以决定是否执行它 组件在单独的线程中执行 如何根据描述符限制这些线
  • 我如何知道Python的unicode函数识别的所有支持的编码

    Python 有一个unicode将字节流转换为 unicode 字符串的内置函数 我只是希望我能查询所有可用的encoding在我的系统上 但如何 这个问题的原因是 有人使用 MAC OS X 向我发送了一封内容编码为 iso 2022
  • 为什么这个 Java 静态字段为空?

    public class StaticTest private static String a private static String b this is a public static void main String args a
  • HQL - 分页的行标识符

    有谁知道HQL是否有一个关键字来标识行 例如ROWID或ROWNUM 我想使用 HQL 实现分页 但我无法使用 setMaxResult 或 setFirstResult 因为我不直接使用会话对象 因此不使用 Query 对象 而只是将查询
  • 问题:将大数据传递给第二个 Activity

    我有一个奇怪的问题 我在网上浏览但没有找到答案 我仍然是android编程的初学者 那么让我们开始吧 我想做的就是用一些数据调用第二个活动 它适用于小数据 但如果数据变大 第二个 Activity 将不会显示 第一个 Activity 将完
  • OS X 终端上 Vim 开关的永久语法

    我使用终端来 vim 进入现有的和新的程序 我讨厌这样一个事实 我总是需要介入 syntax on在命令行上使语法变得丰富多彩 有谁知道如何确保我的终端始终以彩色语法启动 Put syntax on在你的 vimrc file
  • 我应该在远程工作站的哪里放置 CSV 配置文件以进行分布式 JMeter 测试?

    我想做JMeter分布式测试 手册上说首先我应该开始jmeter server在远程节点上 然后我应该更新jmeter config并运行jmeter在主节点上 我做了所有这些步骤 我的测试计划包括使用 CSV 配置文件 如果我只从 1 个
  • 无法在 PHP 中接收 JSON POST 请求

    我正在将 JSON 对象从 Java 传递到 PHP 我正在使用 jdk 1 8 和 WAMPserver 下面是Java代码 import java io IOException import org apache http client
  • double 或 BigDecimal 会溢出吗?

    Java 8 给了我们Math addExact https docs oracle com javase 8 docs api java lang Math html addExact int int 适用于整数 但不适用于小数 是否有可
  • 不要自动切换到更高端的独立GPU

    正如本文所写技术问答 http developer apple com library mac qa qa1734 index html 默认情况下 一旦您的应用程序创建了 OpenGL 上下文 通过 直接调用OpenGL或依赖OpenGL
  • 将 Tango 3D 点投影到屏幕 Google Project Tango

    Project Tango 提供了点云 如何获取点云中 3D 点的像素位置 以米为单位 我尝试使用投影矩阵 但得到的值非常小 0 5 1 3 等 而不是 1234 324 以像素为单位 我包含我尝试过的代码 Get the current
  • 使用 ProGuard 混淆代码后如何保持 javadoc 可见?

    我使用 progured 4 7 混淆了我的代码 并保留了 A 类 其中包含描述该类功能的 javadoc keep public class com mysite ClassA public keepattributes InnerCla
  • 在 libgdx 中截取屏幕截图

    我有一个应用程序 我想在其中截取游戏屏幕的屏幕截图并将其保存为图像并上传到 Facebook 我正在使用 Libgdx 我的重点是 android 谁能帮助我如何以编程方式截取游戏屏幕并将其另存为图像 现在相当容易 Libgdx提供了一个例
  • 在java中访问dll方法

    我正在尝试访问java中用c 编写的dll方法 从下面的代码我试图构建已成功生成的 dll using System using Microsoft Win32 namespace CyberoamWinHelper public clas
  • 从java类文件获取apache webcontents文件夹的绝对路径[重复]

    这个问题在这里已经有答案了 需要在动态 Web 应用程序内获取 java 类文件中的绝对路径 实际上我需要获取 apache webapps 文件夹的路径 部署 webapps 的位置 e g apache root webapps my
  • Java中有没有办法随机获取HashMap的值?

    Java中有没有办法随机获取HashMap的值 这有效 Random generator new Random Object values myHashMap values toArray Object randomValue values
  • Xamarin Macintosh 客户 URL 协议句柄传递的参数

    我编写了一个处理自定义协议的 Macintosh 应用程序
  • 从 google play 中提取统计信息

    我正在建立一些统计数据 并希望获得来自 google play 应用程序商店 的统计数据 最受欢迎 下载量 价格等信息 有谁知道是否有这个 API 或者我必须自己抓取它 有一个名为 android market api 的项目http co

随机推荐