gpt4 book ai didi

java - 无法检查文件系统中是否存在具有德语名称的文件

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:32:31 25 4
gpt4 key购买 nike

背景:

我有 2 台机器:一台运行德语 Windows 7,我的电脑运行英语(使用希伯来语区域设置)Windows 7。
在我的 Perl 代码中,我试图检查我从德国机器获得的文件是否存在于我的机器上。
文件名为 ßßßzllpoöäüljiznppü.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) 函数调用,我相信这就是问题所在。

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

更新:

这是我在 PC 上使用硬编码文件名运行的另一个代码,脚本文件是 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 文件系统(例如旧的 USB 内存棒)或其他非 Unicode 识别文件系统传输文件,这些好处将失去。

您所说的locale 设置只会影响用户界面的语言和明显的文件夹名称(Programme (x86)Program Files ( x86) 后者是文件系统中的真实名称)。

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

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


您的脚本不起作用,因为您引用了一个名为 $read_file 的未定义全局变量。假设您的第二个代码块未包含在任何范围内,尤其是未包含在 sub 中,则 @_ 变量可用。要获取命令行参数,您应该考虑使用 @ARGV 数组。无论如何,您的脚本的逻辑尚不清楚:您将错误消息打印到 STDOUT,而不是 STDERR,您“解码”文件名​​,然后在 else-branch 中打印出未解码的字符串,你对编码很偏执(这通常是好的)但是你没有为你的输出流等指定编码。

关于java - 无法检查文件系统中是否存在具有德语名称的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12175743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com