gpt4 book ai didi

Perl ord 和 chr 使用 unicode

转载 作者:行者123 更新时间:2023-12-04 10:54:37 24 4
gpt4 key购买 nike

令我震惊的是,我刚刚发现 chr不适用于 Unicode,尽管它可以做一些事情。手册页几乎一目了然

Returns the character represented by that NUMBER in the character set. For example, chr(65)" is "A" in either ASCII or Unicode, and chr(0x263a) is a Unicode smiley face.



事实上,我可以使用打印笑脸
perl -e 'print chr(0x263a)'

但诸如 chr(0x00C0)不工作。我看到我的 perl v5.10.1 有点老了,但是当我在源代码中粘贴各种奇怪的字母时,一切都很好。

我尝试过有趣的事情,例如 use utf8use encoding 'utf8' ,我没试过像 use v5.12这样有趣的东西和 use feature 'unicode_strings'因为它们不适用于我的版本,所以我在玩 Encode::decode找出我不需要解码,因为我没有要解码的字节数组。我阅读的文档比以往任何时候都多,并且发现了很多有趣的东西,但没有任何帮助。它看起来有点像 Unicode Bug但没有给出可用的解决方案。而且我不关心整个字符串语义,我需要的只是一个微不足道的函数。

那么如何将数字转换为由与其对应的单个字符组成的字符串,例如 real_chr(0xC0) eq 'À'持有?

我得到的第一个答案解释了关于 IO 的一切,但我仍然不明白为什么
#!/usr/bin/perl -w
use strict;
use utf8;
use encoding 'utf8';

print chr(0x00C0) eq 'À' ? 'eq1' : 'ne1', " - ", chr(0x263a) eq '☺' ? 'eq1' : 'ne1', "\n";

print 'À' =~ /\w/ ? "match1" : "no_match1", " - ", chr(0x00C0) =~ /\w/ ? "match2" : "no_match2", "\n";

打印
ne1 - eq1
match1 - no_match2

表示手动输入的 'À'不同于 chr(0x00C0) .此外,前者是一个单词组成字符(正确!),而后者不是(但应该是!)。

最佳答案

第一的,

perl -le'print chr(0x263A);'

是 buggy 。 Perl 甚至会告诉你:
Wide character in print at -e line 1.

这不符合“工作”的条件。因此,尽管它们在无法提供您想要的东西方面有所不同,但以下都没有给您想要的东西:
perl -le'print chr(0x263A);'

perl -le'print chr(0x00C0);'

要正确输出这些 Unicode 代码点的 UTF-8 编码,您需要告诉 Perl 使用 UTF-8 对 Unicode 点进行编码。
$ perl -le'use open ":std", ":encoding(UTF-8)"; print chr(0x263A);'


$ perl -le'use open ":std", ":encoding(UTF-8)"; print chr(0x00C0);'
À

现在来看看“为什么”。

文件句柄只能传输字节,因此除非您另有说明,否则 Perl 文件句柄处理期望字节。这意味着您提供给 print 的字符串不能包含字节以外的任何内容,或者换句话说,它不能包含超过 255 的字符。输出正是您提供的:
$ perl -e'print map chr, 0x00, 0x65, 0xC0, 0xF0' | od -t x1
0000000 00 65 c0 f0
0000004

这很有用。这与您想要的不同,但这并没有错。如果你想要不同的东西,你只需要告诉 Perl 你想要什么。

通过添加 :encoding层,句柄现在需要一串 Unicode 字符,或者我称之为“文本”。该层告诉 Perl 如何将文本转换为字节。
$ perl -e'
use open ":std", ":encoding(UTF-8)";
print map chr, 0x00, 0x65, 0xC0, 0xF0, 0x263a;
' | od -t x1
0000000 00 65 c3 80 c3 b0 e2 98 ba
0000011

你的权利 chr不知道也不关心 Unicode。赞 length , substr , ordreverse , chr实现了一个基本的字符串函数,而不是一个 Unicode 函数。这并不意味着它不能用于处理文本字符串。如您所见,问题不在于 chr但是在你构建它之后你对字符串所做的事情。

字符是字符串的元素,字符是数字。这意味着一个字符串只是一个数字序列。是否将这些数字视为 Unicode 代码点(文本)、打包的 IP 地址或温度测量值完全取决于您和您将字符串传递给的函数。

以下是一些运算符的示例,它们确实为它们作为操作数接收的字符串分配了含义:
  • m//需要一串 Unicode 代码点。
  • connect期望表示 sockaddr_in 的字节序列结构体。
  • print带 handle 不带:encoding期待一个字节序列。
  • print带 handle :encoding期望一系列 Unicode 代码点。


  • So how can I convert a number into a string consisting of the single character corresponding with it, so that for example real_chr(0xC0) eq 'À' holds?

    chr(0xC0) eq 'À'确实成立。你记得告诉 Perl 你使用 UTF-8 编码你的源代码,使用 use utf8; ?如果您没有告诉 Perl,Perl 实际上会在 RHS 上看到一个两个字符的字符串。

    关于您添加的问题:
    encoding有问题语用。我建议不要使用它。相反,使用
    use open ':std', ':encoding(UTF-8)';

    这将解决其中一个问题。您遇到的另一个问题是
    chr(0x00C0) =~ /\w/

    这是一个已知的错误,由于向后兼容的原因而故意破坏。也就是说,除非您请求更新版本的语言,如下所示:
    use 5.014;    # use 5.012; *might* suffice.

    一个可以追溯到 5.8 的解决方法:
    my $x = chr(0x00C0);
    utf8::upgrade($x);
    $x =~ /\w/

    关于Perl ord 和 chr 使用 unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12291252/

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