【问题标题】:Convert multiple Unicode in a string to character将字符串中的多个 Unicode 转换为字符
【发布时间】:2013-08-31 11:50:27
【问题描述】:

问题——我有一个字符串,比如Buna$002C_TexasBuna$002C_Texas',其中$ 后面是Unicode。我想用它们各自的 Unicode 字符表示来替换这些 Unicode。

Perl中,如果任何Unicode是“\x{002C}”的形式,那么它将被转换为相应的Unicode字符。下面是示例代码。

#!/usr/bin/perl
my $string = "Hello \x{263A}!\n";
@arr= split //,$string;
print "@arr";

我正在处理一个包含 1000 万条记录的文件。所以我将这些字符串放在一个标量变量中。要执行与上述相同的操作,我将$4_digit_unicode 替换为\x{4_digit_unicode},如下所示。

$str = 'Buna$002C_TexasBuna$002C_Texas';
$str =~s/\$(.{4})/\\x\{$1\}/g;
$str = "$str"

它给了我

Buna\x{002C}_TexasBuna\x{002C}_Texas

这是因为在$str = "$str",行$str 正在被插值,而不是它的值。所以\x{002C} 没有被 Perl 插值。

有没有办法强制 Perl 也插入 $str 的内容?

还有其他方法可以实现吗?我不想取出每个 Unicode,然后使用 pack "U4",0x002C 将其打包,然后将其替换回去。但是一行中的某些内容(例如以下不成功的尝试)是可以的。

$str =~ s/\$(.{4})/pack("U4",$1)/g;

我知道以上是错误的;但是我可以像上面那样做吗?

对于输入字符串$str = 'Buna$002C_TexasBuna$002C_Texas',所需的输出是Buna,_TexasBuna,_Texas

【问题讨论】:

    标签: regex string perl unicode


    【解决方案1】:

    这给出了预期的结果:

    use strict;
    use warnings;
    use feature 'say';
    
    my $str = 'Buna$002C_TexasBuna$002C_Texas';
    
    $str =~s/\$(.{4})/chr(hex($1))/eg;
    
    say $str;
    

    主要有趣的项目是s///eg 中的ee 表示将替换文本视为要执行的代码。 hex() 将十六进制字符串转换为数字。 chr() 将数字转换为字符。替换行最好如下编写,以避免尝试转换后跟非十六进制字符的美元。

    $str =~s/\$([0-9a-f]{4})/chr(hex($1))/egi;
    

    【讨论】:

      【解决方案2】:

      可以在替换字符串中执行pack等语句,只需要使用e正则表达式修饰符即可。

      或者你可以这样做

      $str =~s/\$(.{4})/"@{[pack("U4",$1)]}/g;
      

      如果这两个选项不起作用,请告诉我,查看Stackoverflow question 了解更多信息。

      【讨论】:

        【解决方案3】:

        "\x{263A}"(包括引号)是一个字符串文字,一段代码,当解释器评估时,它会生成一个包含唯一字符263A的字符串(作为脚本的一部分传递给perl 进行评估)。

        另一方面,"\\x\{$1\}"(包括引号)产生一个由\x{$1} 的内容组成的字符串。

        后者是您正在生成的字符串。您似乎正在尝试生成 Perl 代码,但它不是有效的 Perl 代码 - 它缺少引号 - 而且您永远不会让 perl 解释代码。


         $str =~ s/\$(.{4})/\\x\{$1\}/g;
        

        简称

         $str =~ s/\$(.{4})/ "\\x\{$1\}" /eg;
        

        这完全不同于

         $str =~ s/\$(.{4})/ "\x{263A}" /eg;
        

        看起来您打算执行以下操作:

        $str =~ s/\$(.{4})/ eval qq{"\\x\{$1\}"} /eg;
        

        但是有更简单的方法可以生成所需的字符串,例如

        $str =~ s/\$(.{4})/ pack "U4", $1 /eg;
        

        或者更好,

        $str =~ s/\$(.{4})/ chr hex $1 /eg;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-03
          相关资源
          最近更新 更多