代码之家  ›  专栏  ›  技术社区  ›  Mark C

在Perl中将UTF8字符串转换为ASCII

  •  12
  • Mark C  · 技术社区  · 16 年前

    我尝试了Google和StackOverflow推荐的所有东西(我能找到的),包括使用Encode。我的代码工作,但它只是使用UTF8和我得到了广泛的字符警告。我知道如何解决这些警告,但我不使用UTF8的任何其他东西,所以我想只是转换它,而不必调整我的代码来处理它的其余部分。这是我的密码:

    my $xml = XMLin($content);
    # Populate the @titles array with each item title.
    my @titles;
    for my $item (@{$xml->{channel}->{item}}) {
        my $title = Encode::decode_utf8($item->{title});
        #my $title = $item->{title};
        #utf8::downgrade($title, 1);
        Encode::from_to($title, 'utf8', 'iso-8859-1');
        push @titles, $title;
    }
    return @titles;
    

    你可以看到我尝试过的其他一些东西。我很清楚我不知道我在这里做什么。我只想以一个普通的ASCII字符串结束。任何想法都将不胜感激。谢谢。

    3 回复  |  直到 16 年前
        1
  •  19
  •   Borodin    9 年前

    • 表示UTF-8编码字符串的字节。

    字符的概念是Perl内部的。当你表演的时候 Encode::decode_utf8 0xC3 0xB6 decode_utf8 返回一个表示形式,该表示形式可以看到一个字符,而不是两个字节: ö

    然后可以继续在Perl中操作该字符串。为了进一步说明差异,请考虑以下代码:

    my $bytes = "\xC3\xB6";
    say length($bytes); # prints "2"
    my $string = decode_utf8($bytes);
    say length($string); # prints "1"
    
    • ASCII是Unicode的一个非常小的子集,其中该范围内的字符由一个字节表示。将Unicode转换为ASCII本身就是一种有损操作,因为大多数Unicode字符不是ASCII字符。当您试图将Unicode字符串强制转换为ASCII时,您要么被迫删除字符串中所有非ASCII格式的字符,要么尝试从Unicode字符映射到最接近的ASCII等效字符(这在绝大多数情况下是不可能的)。

    由于您有宽字符警告,这意味着您试图操作(可能输出)不能表示为ASCII或ISO-8859-1的Unicode字符。

    perldoc 学习 perlunitut , perlunifaq perlunicode , perluniintro ,和 Encode .

        2
  •  7
  •   John C    14 年前

    虽然这是一个老问题,我只是花了几个小时(!)试着做或多或少相同的事情!也就是说:从UTF-8xml文件中读取数据,并将数据转换成Windows-1252代码页(我也可以使用Latin1、ISO-8859-1等),以便能够创建带有重音字母的文件名。

    经过多次试验,甚至 更多 搜索,我终于设法使转换工作。“诀窍”是使用编码: 编码 而不是编码: .

    例如,给定原始问题中的代码 :-)从UTF-8转换的方法是:

    my $title = Encode::encode("Windows-1252", $item->{title});
    

    my $title = Encode::encode("ISO-8859-1", $item->{title});
    

    my $title = Encode::encode("<your-favourite-codepage-here>", $item->{title});
    

    我希望这能帮助其他有类似问题的人!

        3
  •  2
  •   jpaugh JotaBe    15 年前

    您可以使用下面的行来简单地删除警告。这假设您想要使用UTF8,这通常不是问题。

    binmode(STDOUT, ":encoding(utf8)");

    推荐文章