Java 无法检查文件系统中是否存在德语名称的文件
背景: 我有两台机器:一台运行德语windows 7,我的电脑运行英语(希伯来语区域设置)windows 7。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
在我的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编码文件名的代码,以证明它也不起作用。