如何检测latin1和UTF-8?

Jas*_*nes 2 unicode perl encoding utf-8 latin1

我从XML文件中提取字符串,即使它应该是纯UTF-8,但事实并非如此.我的想法是

#!/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"; }
Run Code Online (Sandbox Code Playgroud)

输出

$VAR1 = 'm?gtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
$VAR1 = 'mægtig';
3
Run Code Online (Sandbox Code Playgroud)

根据只有latin1字符串会增加其长度的想法,但编码已经是UTF-8也会使它更长.所以我无法通过这种方式检测到latin1与UTF-8.

我想最终总是使用UTF-8字符串,但是如何检测它是latin1还是UTF-8,所以我只转换latin1字符串?

如果一个字符串是UTF-8,那么能够获得是/否将同样有用.

ike*_*ami 7

由于UTF-8的某些属性,使用iso-8859-1编码的文本不太可能是有效的UTF-8,除非它使用两种编码进行相同的解码[1].

因此,解决方案是尝试使用UTF-8对其进行解码.如果失败,请使用iso-8859-1对其进行解码.由于使用iso-8859-1解码是一个无操作,我将跳过这一步.


现在,你说你想要UTF-8.UTF-8是通过编码解码文本获得的.


笔记

  1. 假设文本是有效的UTF-8或有效的iso-8859-1,如果满足以下所有条件,我的解决方案只会猜错:

    • 该文本使用iso-8859-1编码(与UTF-8相对),
    • [
      80> 81,82,84,85,86 <87> <88> <88> <8B> <8>> <8D> <8E>中的至少一个> <8F>
      <90> <91> <92> <93> <95> <96> <97> <98> <99> <9> <9> <9>> 9D> <9E> <9F >
      <NBSP>¡¢£¤¥|§¨©ª«¬<SHY>®°±²³'μ·¸¹º»¼½¾¿
      ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
      àáâãäåæçèéêëìíîïðñòóôõö÷
      ]存在,
    • 所有[ÀÁÃ¼ÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß]的实例之后是[
      <80> 81,88,88,85,86,88,88,88,88,88中的一个实例.<8C> <8D> <8E> <8F>
      <90> <91> <93> <93> <95> <96> <97> <98> <99> <9> <9> <9> > <9D> <9E> <9F>
      <NBSP>¡¥¥§|ª«¬<SHY>®¯°±³³'μ·¸¹º»¼½¾¿],
    • 所有[àáâããååæçèéêëìíï]的实例后跟两个[
      <80> <81> <82> <83> <84> <85> <86> <87> <88> <89> <8A> <8B> <8C > <8D> <8E> <8F>
      <90> <91> <92> <94> <95> <96> <97> <98> <99> <9A> <9> <9C> < 9D> <9E> <9F>
      <NBSP>¡¥¥§|ª«¬<SHY>®¯°±³³'μ·¸¹º»¼½¾¿],
    • 所有[ðñòóõö÷]的实例后面跟着三个[
      <80> <81> <83> <84> <85> <86> <87> <88> <89> <8A> <8B> < 8C> <8D> <8E> <8F>
      <90> <91> <93> <94> <95> <96> <97> <99> <99> <9> <9> 9C> <9D> <9E> <9F>
      <NBSP>¡¥¥§|ª«¬<SHY>®¯°±³³'μ·¸¹º»¼½¾¿],
    • 没有[øùúûüýþÿ]存在,和
    • [
      80> <82> <83> <84> <85> <86> <87> <88> <89> <8B> <8B> <8C> <8D> <8E> <8F均无>
      <90> <91> <93> <94> <95> <96> <97> <98> <99> <9> <9> 9C> <9D> <9E> <9F>
      <
      除前面提到的以外,存在NBSP>¢¥|§¨ªª¬¬<SHY>®¯°±³³'μ·¸¹º»¼½¾¿

    (<80> .. <9F>是未分配或不可打印的控制字符,不确定是哪个.)

    换句话说,该代码非常可靠.

  • 我不使用UTF-8编码UTF-8字节.我不编码UTF-8字节,句点.我使用UTF-8编码解码文本(Unicode代码点). (2认同)