【问题标题】:writing unicode string to binary file in perl在perl中将unicode字符串写入二进制文件
【发布时间】:2012-01-02 16:02:13
【问题描述】:

我有一个包含非 UTF8 字符的字符串,例如“עברית” 我想将字符串写入文件而不对字符串进行编码。为此,我打开文件以二进制形式写入:

open my $fh, ">>:raw", "/tmp/bla";
print $fh $mystring;
close $fh;

问题是文件已损坏。我以二进制视图打开它,一些字节已损坏。 难道我做错了什么?不编码就不能将字符串写入文件吗?

【问题讨论】:

  • 怎么不是UTF8?如果正确打开,它会在内部使用 UTF8。

标签: perl file unicode binary


【解决方案1】:

您的评估是正确的,这样做是错误的。 You must encode text:raw is for binary data,例如图片。如果您发现 UTF-8 不合适,也许您正在寻找编码 ISO-8859-8 或 Windows-1255。

阅读http://p3rl.org/UNI,了解 Perl 中的编码主题。

【讨论】:

  • 但是为什么不正确呢?我不明白。我不能把字符串写成二进制吗?我在编码时遇到问题,因为我对读取文件的应用程序没有任何控制权,并且必须对其进行解码,这些应用程序不是用 perl 而是用 c 编写的。
  • @Shay,那么你的 C 程序期望什么编码?
  • @daxim 要保存 PDF 文件,除了将其编写为二进制文件外,我没有发现任何其他方法。例如,open(PDF, ">$filename");二进制模式 PDF;打印 PDF $contents,将文件写入二进制文件。之后我可以在 vim 中打开它并将其作为文本阅读,尽管部分看起来很有趣。任何使用编码写入它的尝试都会破坏文件。为什么 PDF 是个例外?
  • 那是因为 PDF 不是文本,而是二进制数据。正如我在帖子中所写,:raw 层是合适的。文件句柄上的binmode 以老式的方式实现了同样的效果。
【解决方案2】:

编码是使用字节来表示文本。例如,

ת  === UTF-8 ==========>  D7 AA
ת  === Windows-1255 ===>  FA
ת  === iso-8859-8 =====>  FA

在不编码的情况下将文本存储在文件中是不可能的,因为文件只能包含字节。

如果$mystring 已经包含字节(编码文本),但你说你有一个“Unicode 字符串”,你的代码就可以工作。


我认为您已经得出结论,您的文件已损坏,使用

cat file

或类似的。在这种情况下,您希望根据您的语言环境对文件进行编码。

use open ':locale';
open my $fh, ">>", "file" or die $!;
print $fh $mystring;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 2015-07-02
    • 2021-10-27
    • 2016-01-15
    • 2012-09-22
    • 2016-10-03
    • 2010-10-15
    相关资源
    最近更新 更多