- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试创建一些目录,这些目录具有国家符号,如“äöü”等。不幸的是,每当尝试这样做时,我都会收到此异常:
java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /home/pi/myFolder/löwen
at sun.nio.fs.UnixPath.encode(UnixPath.java:147)
at sun.nio.fs.UnixPath.<init>(UnixPath.java:71)
at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281)
at java.nio.file.Paths.get(Paths.java:84)
at org.someone.something.file.PathManager.createPathIfNecessary(PathManager.java:161)
...
at java.lang.Thread.run(Thread.java:744)
我的代码是这样的:
public static void createPathIfNecessary(String directoryPath) throws IOException {
Path path = Paths.get(directoryPath);
// if directory exists?
if (!Files.exists(path)) {
Files.createDirectories(path);
} else if (!Files.isDirectory(path)) {
throw new IOException("The path " + path + " is not a directory as expected!");
}
}
我搜索了可能的解决方案,大多数建议将语言环境设置为 UTF-8,所以我认为如果我将 Linux 中的语言环境设置为 UTF-8 就可以解决这个问题,但我发现它已经是 UTF一直是 -8,尽管是新设置的,但我仍然遇到同样的问题。
$ locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
我在 Windows 7 上没有这个问题,它完美地创建了目录,所以我想知道我是否需要改进 java 代码以更好地处理这种情况,或者在我的 Linux 中改变一些东西。
我运行它的 Linux 是 Raspberry Pi 2 上的 Raspbian:
$ cat /etc/*-release
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"
NAME="Raspbian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=raspbian
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
我在 Tomcat 7 服务器上运行我的应用程序(我相信 Java 版本是 1.8),我的 setenv.sh 以:export JAVA_OPTS="-Dfile.encoding=UTF-8 ...
有没有人能解决这个问题?我需要能够在目录/文件名中使用这些国家符号...
编辑:
在我的 Tomcat setenv.sh 的开头添加额外选项 Dsun.jnu.encoding=UTF-8 并重新启动后发生了一些变化。
目前我的 setenv.sh 开始是这样的
export JAVA_OPTS="-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8
似乎这个异常消失了,并且创建了带有国家符号的文件夹,但是问题似乎没有完全解决,每当我尝试在该目录中创建/写入文件时,我现在得到:
java.io.FileNotFoundException: /home/pi/myFolder/löwen/Lowen.tmp (No such file or directory)
at java.io.FileOutputStream.open(Native Method)
at java.io.FileOutputStream.<init>(FileOutputStream.java:206)
at java.io.FileOutputStream.<init>(FileOutputStream.java:156)
at org.someone.something.MyFileWriter.downloadFiles(MyFileWriter.java:364)
...
at java.lang.Thread.run(Thread.java:744)
它发生的代码如下所示:
// output here
File myOutputFile = new File(filePath);
FileOutputStream out = (new FileOutputStream(myOutputFile));
out.write(bytes);
out.close();
它似乎在 (new FileOutputStream(myOutputFile)) 上失败了;当它尝试使用 File 对象初始化 FileOutputStream 时,该 File 对象的路径是根据从上述异常中的路径检索到的字符串创建的,并在末尾添加了一个文件名。
现在目录已创建,但是在其中写入或创建任何内容仍然会导致上述异常,尽管其中的文件不包含国家符号。
在没有国家符号的情况下在其中创建路径和文件与 setenv.sh 更改之前一样完美,所以看起来问题仍然与路径中的国家符号有关......
最佳答案
只需设置环境变量“LANG=en_US.UTF-8”或其他一些“xxx.UTF-8”。( https://www.gnu.org/software/gettext/manual/html_node/Locale-Environment-Variables.html )
JNIEXPORT jboolean JNICALL
Java_java_io_UnixFileSystem_createDirectory(JNIEnv *env, jobject this,
jobject file)
{
jboolean rv = JNI_FALSE;
WITH_FIELD_PLATFORM_STRING(env, file, ids.path, path) {
if (mkdir(path, 0777) == 0) {
rv = JNI_TRUE;
}
} END_PLATFORM_STRING(env, path);
return rv;
}
#define WITH_PLATFORM_STRING(env, strexp, var)
if (1) {
const char *var;
jstring _##var##str = (strexp);
if (_##var##str == NULL) {
JNU_ThrowNullPointerException((env), NULL);
goto _##var##end;
}
var = JNU_GetStringPlatformChars((env), _##var##str, NULL);
if (var == NULL) goto _##var##end;
#define WITH_FIELD_PLATFORM_STRING(env, object, id, var)
WITH_PLATFORM_STRING(env,
((object == NULL)
? NULL
: (*(env))->GetObjectField((env), (object), (id))),
var)
Java 在此方法中将所有字符串本地转换为平台的本地编码:jdk/src/share/native/common/jni_util.c - JNU_GetStringPlatformChars() 。系统属性 sun.jnu.encoding 用于确定平台的编码。
sun.jnu.encoding 的值设置在 jdk/src/solaris/native/java/lang/java_props_md.c - GetJavaProperties() 使用 libc 的 setlocale() 方法。环境变量 LC_ALL 用于设置 sun.jnu.encoding 的值。在命令提示符下使用 -Dsun.jnu.encoding 选项为 Java 提供的值将被忽略。
关于java.nio.file.InvalidPathException : Malformed input or input contains unmappable characters when using national characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39185613/
我正在为我的公司购买新的数据采集系统以用于各种项目。起初,它的主要目的是监控多达 20 个热电偶并控制复合 Material 炉的温度。但是,我还计划用它来监控加速度计、应变仪,并用作信号发生器。 我
我正在使用 NI 的 Labwindows CVI,并且正在尝试集成源代码控制。据说它适用于任何适合 MS API (MSSCC/SCC) 的东西,但我在实践中没有发现这种情况。如果有一个 SVN 服
国家 build 者的新手,希望编辑一个实时的国家 build 者网站。我想制作可用于测试的站点的副本/沙盒。 任何有关如何复制 nationbuilder 站点或 nationbuilder 测试/
我正在尝试学习Hadoop。我正在尝试将National Climatic Data Center数据获取到新安装的Hadoop Master中。获取整个数据的最简单方法是什么 编辑:由于我获得了否决
我试图通过使用Sqoop将Hive表导出到SQL Server。我在 hive 表中有一个字符串字段,SQL Server中此字段的格式为varchar(255)。在运行以下Sqoop导出时: sqo
我使用 mysql 命令行实用程序在具有足够列长度的表上运行包含 INSERT 语句的 SQL 脚本,但出现错误: 第 115 行的错误 1406 (22001):第 1 行“名称”列的数据太长 请注
我想使用波兰国家字符进行 Base64 编码。例如: "zażółć gęślą jaźń" 应该是: emEmIzM4MDvzJiMzMjI7JiMyNjM7IGcmIzI4MTsmIzM0Nzts
我去看看这里有没有程序octave的数据采集工具箱,没找到http://octave.sourceforge.net/packages.php 我想做的是使用我的 National Instrumen
我希望在 R 中重新创建完整的 Ordnance Survey National Grid(如此处所示 https://upload.wikimedia.org/wikipedia/commons/f
我有 Oracle 11 数据库,我使用 JDBC 和 ODBC 连接到该数据库。 JDBC 运行良好,但在 ODBC 中,SELECT 结果中的所有波兰字母都更改为等效的拉丁字母,例如 ± -> a
我是一个非常新手的程序员,只有脚本编写经验(主要是 VBA 和 Python)。我的一位教授要求我使用 C# 编写一个应用程序来操作激光三角测量扫描仪。我知道一旦获得原始电压数据,我就可以做其他所有事
我使用的是 xcode 6.4、Swift 和 iOS8。我的目标是使用谷歌地图(和地点?)sdk 显示 map 。当我在谷歌地图上搜索“国家公园”时,这张 map 应该包含谷歌提供的所有结果。 我已
我仅在 jsp 和 mysql 中创建了创建、插入、更新、删除、退出程序。我得到了插入、删除、退出和创建的解决方案,但是,只有更新部分我得到了错误。在我的数据库中,名称是员工,表名是员工,字段的顺序如
我正在尝试创建一些目录,这些目录具有国家符号,如“äöü”等。不幸的是,每当尝试这样做时,我都会收到此异常: java.nio.file.InvalidPathException: Malformed
我是一名优秀的程序员,十分优秀!