gpt4 book ai didi

windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?

转载 作者:可可西里 更新时间:2023-11-01 12:41:20 27 4
gpt4 key购买 nike

我正在努力创建一个包含非 ASCII 字符的文件。

如果使用 0 作为参数调用以下脚本,则它工作正常,但在使用 1 调用时终止。

错误信息是open: Invalid argument at C:\temp\filename.pl line 15。

脚本在 cmd.exe 中启动。

我希望它写入一个名称为(取决于参数)äöü.txtäöü☺.txt 的文件。但是我无法创建包含笑脸的文件名。

use warnings;
use strict;

use Encode 'encode';

# Text is stored in utf8 within *this* file.
use utf8;

my $with_smiley = $ARGV[0];

my $filename = 'äöü' .
($with_smiley ? '☺' : '' ).
'.txt';

open (my $fh, '>', encode('cp1252', $filename)) or die "open: $!";

print $fh "Filename: $filename\n";

close $fh;

我可能遗漏了一些对其他人来说很明显的东西,但我找不到,所以我很感激任何解决这个问题的建议。

最佳答案

首先,说“UTF-8 字符”很奇怪。 UTF-8可以编码任何Unicode字符,所以UTF-8字符集就是Unicode字符集。这意味着您要创建名称包含 Unicode 字符的文件,更具体地说,是不在 cp1252 中的 Unicode 字符。

我已经 answered这在过去的 PerlMonks 上。答案复制如下。


Perl 将文件名视为不透明的字节串。这意味着文件名需要根据您的“区域设置”的编码(ANSI 代码页)进行编码。

在Windows中,通常使用代码页1252,因此编码通常为cp1252。 .* 但是,cp1252 不支持泰米尔语和印地语字符 [或“☺”]。

Windows 还提供了一个“Unicode”又名“Wide”接口(interface),但 Perl 不提供使用内置函数访问它**。您可以使用 Win32API::FileCreateFileW,不过。 IIRC,您仍然需要自己对文件名进行编码。如果是这样,您将使用 UTF-16le 作为编码。

前述Win32::Unicode似乎处理了一些使用 Win32API::File 的肮脏工作为你。我还建议从那开始。

* — 代码页由 GetACP 系统调用返回(作为数字)。前置 "cp"以获得编码。

** — Perl 对 Windows 的支持在某些方面很糟糕。

关于windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205940/

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