Java 无法检查文件系统中是否存在德语名称的文件

Java 无法检查文件系统中是否存在德语名称的文件,java,perl,utf-8,local,Java,Perl,Utf 8,Local,背景: 我有两台机器:一台运行德语windows 7,我的电脑运行英语(希伯来语区域设置)windows 7。 在我的Perl代码中,我试图检查我从德国机器上获得的文件是否存在于我的机器上。 文件名是ßßßzllpoöäljiznpü.txt 为什么执行以下代码时失败: use Encode; use Encode::locale; sub UTF8ToLocale { my $str = decode("utf8",$_[0]); return encode(locale, $str

背景

我有两台机器:一台运行德语windows 7,我的电脑运行英语(希伯来语区域设置)windows 7。
在我的Perl代码中,我试图检查我从德国机器上获得的文件是否存在于我的机器上。
文件名是ßßßzllpoöäljiznpü.txt

为什么执行以下代码时失败:

use Encode;
use Encode::locale;

sub UTF8ToLocale
{
  my $str = decode("utf8",$_[0]);
  return encode(locale, $str);
}

if(!-e UTF8ToLocale($read_file))
{
   print "failed to open the file";
}
else
{
   print $read_file;
}
当我试图打开文件时,也会发生同样的事情:

open (wtFile, ">", UTF8ToLocale($read_file));  
binmode wtFile;
shift @_;
print wtFile @_;
close wtFile;
在我的java应用程序中,文件名从德语转换为utf8,并传递给perl脚本。 perl脚本使用这个文件名并将其从utf8转换为系统语言环境,请参阅UTF8ToLocale($read_file)函数调用,我认为这就是问题所在

问题:
您能告诉我什么是操作系统文件系统字符集编码吗?
当我在操作系统中创建德语文件名时,语言环境是希伯来语,它保存在哪个字符集中?
我如何解决这个问题

更新:

下面是我在电脑上使用硬编码文件名运行的另一个代码,脚本文件是utf8编码的:

use Encode;
use Encode::locale;

my $string = encode("utf-16",decode("utf8","C:\\TestPerl\\ßßßzllpoöäüljiznppü.txt"));

if (-e $string)
{
  print "exists\r\n";
}
else
{
  print "not exists\r\n"
}
输出为“不存在”。 我还尝试了不同的字符集:cp1252、cp850、utf-16le,都不起作用。 如果我将文件名更改为英语或希伯来语(我的默认区域设置),它会工作。
有什么想法吗?

Windows 7在内部使用UTF-16(需要引用)(我不记得字节顺序)。因此,不需要转换文件名。但是,如果您通过FAT文件系统(例如旧的U盘)或其他不支持Unicode的文件系统传输文件,这些好处将丢失

您正在谈论的区域设置仅影响用户界面的语言和明显的文件夹名称(
Program(x86)
vs.
Program Files(x86)
,后者是文件系统中的真实名称)

我能看到的更大的问题是要传输的文件内容的内部编码,因为某些应用程序可能会根据区域设置默认为不同的编码。除了在创建文件时显式显示外,没有其他解决方案。坚持UTF-8通常是个好主意

为什么要用其他工具转换文件名?任何Unicode编码都应足以进行传输



您的脚本无法工作,因为您引用了一个名为
$read\u file
的未定义全局变量。假设第二个代码块未包含在任何作用域中,特别是未包含在
中,则
@
变量不可用。要获得命令行参数,您应该考虑使用<代码> @ ARGV < /Cord>数组。脚本的逻辑也不清楚:您将错误消息打印到STDOUT,而不是STDERR,您“解码”文件名,然后在
else
-分支中打印出未解码的字符串,您对编码有偏见(这通常是好的)但是您没有为输出流等指定编码。

$LANG环境变量通常包含控制台编码谢谢您的尝试,但我仍然缺少一些信息,我已经考虑了您在中所说的内容。我的问题是…抱歉最后的评论它溜走了。。。问题是,即使我按原样使用文件名,使用utf8编码,它仍然不起作用。我得到消息:“没有这样的文件或目录”。主要的问题是当对文件名调用操作符-e时会发生什么?它如何在文件系统中搜索?它是否执行任何转换?它期望什么?我相信这与本地系统有关,因为如果我在我的PC上将本地系统更改为德语,它就会工作!但只要我的电脑在希伯来文本地,他就会搜索用希伯来文编码的文件,如果我错了,请纠正我。@shlomikl
-e
操作符测试给定的文件名(相对或绝对路径)是否存在。完全不进行转换比耍一些花招更可能成功。正如我指出的,一些目录根据区域设置有不同的名称,但文件系统编码从不改变。您在问题中给出的代码是否完整?它无法以当前形式运行。代码不完整,但其余部分不相关,只需假设$read_文件是有效的定义变量,并忽略代码的第二部分:“open”。假设$read_文件是utf-8编码的文件名,我想知道它是否存在于我的电脑上,这很简单。我将发布另一个带有hrad编码文件名的代码,以证明它也不起作用。