How to detect latin1 and utf-8?

I am extracting lines from an XML file, and although it should be pure UTF-8, it is not. My idea was to

#!/usr/bin/perl
use warnings;
use strict;
use Encode qw(decode encode);
use Data::Dumper;

my $x = "m\x{e6}gtig";
my $y = "m\x{c3}\x{a6}gtig";

my $a = encode('UTF-8', $x);
my $b = encode('UTF-8', $y);

print Dumper $x;
print Dumper $y;
print Dumper $a;
print Dumper $b;

if ($x eq $y) { print "1\n"; }
if ($x eq $a) { print "2\n"; }
if ($a eq $y) { print "3\n"; }
if ($a eq $b) { print "4\n"; }
if ($x eq $b) { print "5\n"; }
if ($y eq $b) { print "6\n"; }

exits

$VAR1 = 'm gtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
3

in theory, only the latin1 line will increase its length, but encoding already UTF-8 also makes it longer. Therefore, I cannot detect latin1 against UTF-8 this way.

Question

I would always like to get the UTF-8 string, but how can I determine if it is latin1 or UTF-8, so I only convert the latin1 string?

The ability to get yes / no if the UTF-8 string is just as useful.

+2
source share
1 answer

- UTF-8 , , iso-8859-1, UTF-8, [1].

, UTF-8. , , iso-8859-1. iso-8859-1 no-op, .

  • utf8:: :

    my $decoded_text = $utf8_or_latin1;
    utf8::decode($decoded_text);
    
  • Encode:: implementation:

    use Encode qw( decode_utf8 );
    
    my $decoded_text =
       eval { decode_utf8($utf8_or_latin1, Encode::FB_CROAK|Encode::LEAVE_SRC) }
          // $utf8_or_latin1;
    

, UTF-8. UTF-8 .

  • utf8:: :

    my $utf8 = $decoded_text;
    utf8::encode($utf8);
    
  • Encode:: implementation:

    use Encode qw( encode_utf8 );
    
    my $utf8 = encode_utf8($decoded_text);
    

  • , UTF-8, iso-8859-1, , :

    • iso-8859-1 ( UTF-8),
    • [< 80] < 81 < 82 < 83 <84 > 85 < 86 < 87 <88 > < 89 > < 8A > < 8 > < 8C > < 8D > < 8E > < 8F >
      < 90 > < 91 > < 92 > < 93 > < 94 > < 95 > < 96 > < 97 > < 98 > < 99 > < 9 > < 9 > < 9C > < 9D > < 9 > < 9F >
      <NBSP> & # xa1; & # XA2; & # XA3; & # xa4; & # xA5; & # xA6; & # xA7; & # xA8; & # xA9; & # ; & # XAB; & # XAC; <SHY> & # XAE; & # XAF; & # XB0; & # XB1; & # XB2; ​​& # xB3; & # XB4; & # XB5; & # XB6; & # xB7; & # XB8; & # xB9; & #xBA; & # Xbb; & # XBC; & # XBD; & # XBE; & # XBF;
      & # xC0; & # xc1; & # xc2; & # xc3; & # XC4; & # xC5; & # XC6; & # xC7; & # xC8; & # xC9; & # XCA; & # XCB; & # XCC; & # XCD; & # xCE; & # XCF; & # xD0; & # xd1; & # XD2; & # XD3; & # xD4; & # xd5; & # xD6; & # xD7; & # xD8; & # xD9; & # XDA; & # XDB; & # XDc; & # XDD; & # XDE; & # XDF;
      & # xE0; & # xe1; & # XE2; & # XE3; & # xe4; & # xe5; & # XE6; & # xE7; & # X 8; & # xE9; & # XEA; & # xEB; & # XEC; & # XED; & # Xee; & # XEF; & # xF0; & # xF1; & # xF2; & # xF3; & # XF4; & # xF5; & # XF6; & # xF7;
      ] ,
    • [& # xC0; & # xC1; & # xC2; & # xC3; & # xC4; & # xC5; & # xC6; & # xC7; & # xC8; & # xC9; & # xCA; & # XCB; & # XCC; & # XCD; & # xCE; & # XCF; & # xD0; & # xd1; & # XD2; & # XD3; & # xD4; & # xd5; & # xD6; & # xD7; & # xD8; & # xD9; & # xDA; & # xDB; & # xDC; & # xDD; & # xDE; & # xDF;] [< 80 <; 81 > < 82 > < 83 > < 84 > < 85 > < 86 > < 87 > < 88 > < 89 > < 8A > < 8 > < 8C > < 8D > < 8E > < 8F >
      < 90 > < 91 > < 92 > < 93 > < 94 > < 95 > < 96 > < 97 > < 98 > < 99 > < 9 > < 9 > < 9C > < 9D > < 9 > < 9F >
      <NBSP> & # xa1; & # XA2; & # XA3; & # xa4; & # xA5; & # xA6; & # xA7; & # xA8; & # xA9; & # ; & # XAB; & # XAC; <SHY> & # XAE; & # XAF; & # XB0; & # XB1; & # XB2; ​​& # xB3; & # XB4; & # XB5; & # XB6; & # xB7; & # XB8; & # xB9; & # Xba; & # Xbb; & # XBC; & # XBD; & #xBE; & # XBF;],
    • [& # xE0; & # xE1; & # xE2; & # xE3; & # xE4; & # xE5; & # xE6; & # xE7; & # xE8; & # xE9; & # xEA, & # xEB; & # xEC; & # xED; & # xEE; & # xEF;] [< 80 < 81 < 82 < 83 < 84 > < 85 > < 86 > < 87 > < 88 > < 89 > < 8A > < 8 > < 8C > < 8D > < 8E > < 8F >
      < 90 > < 91 > < 92 > < 93 > < 94 > < 95 > < 96 > < 97 > < 98 > < 99 > < 9 > < 9 > < 9C > < 9D > < 9 > < 9F >
      <NBSP> & # xa1; & # XA2; & # XA3; & # xa4; & # xA5; & # xA6; & # xA7; & # xA8; & # xA9; & # ; & # XAB; & # XAC; <SHY> & # XAE; & # XAF; & # XB0; & # XB1; & # XB2; ​​& # xB3; & # XB4; & # XB5; & # XB6; & # xB7; & # XB8; & # xB9; & # Xba; & # Xbb; & # XBC; & # XBD; & # XBE; & # XBF;],
    • [& # xF0; & # xF1; & # xF2; & # xF3; & # xF4; & # xF5; & # xF6; & # xF7;] [< lt; 80 > < 81 > < 82 > < 83 > < 84 > < 85 > < 86 > < 87 > < 88 > < 89 > < 8A > < 8 > < 8C > < 8D > < 8E > < 8F >
      < 90 > < 91 > < 92 > < 93 > < 94 > < 95 > < 96 > < 97 > < 98 > < 99 > < 9 > < 9 > < 9C > < 9D > < 9 > < 9F >
      <NBSP> & # xa1; & # XA2; & # XA3; & # xa4; & # xA5; & # xA6; & # xA7; & # xA8; & # xA9; & # ; & # XAB; & # XAC; <SHY> & # XAE; & # XAF; & # XB0; & # XB1; & # XB2; ​​& # xB3; & # XB4; & # XB5; & # XB6; & # xB7; & # XB8; & # xB9; & # Xba; & # Xbb; & # XBC; & #xBD; & # XBE; & # XBF;],
    • [& # xF8; & # xF9; & # xFA; & # xFB; & # xFC; & # xFD; & # xFE; & # xFF;] ,
    • [< 80 > < 81 < 82 < 83 < 84 < 85 < 86 < 87 < 88 < 89 <; 8A > < 8 > < 8C > < 8D > < 8E > < 8F >
      < 90 > < 91 > < 92 > < 93 > < 94 > < 95 > < 96 > < 97 > < 98 > < 99 > < 9 > < 9 > < 9C > < 9D > < 9 > < 9F >
      <NBSP> & # xa1; & # XA2; & # XA3; & # xa4; & # xA5; & # xA6; & # xA7; & # xA8; & # xA9; & # ; & # XAB; & # XAC; <SHY> & #xAE; & # XAF; & # XB0; & # XB1; & # XB2; ​​& # xB3; & # XB4; & # XB5; & # XB6; & # xB7; & # XB8; & # xB9; & # Xba; & # xBB; & # xBC; & # xBD; & # xBE; & # xBF;
      ] , , .

    (<80 > < 9F > , , .)

    , .

+7

Source: https://habr.com/ru/post/1536124/


All Articles