2013-05-09 20 views
7

Jaki jest dobry sposób utworzenia łańcucha perla z zestawem flag UTF8, ale zawiera on niepoprawną sekwencję bajtów UTF8?Utwórz nieprawidłowy ciąg znaków UTF8?

Czy istnieje sposób ustawienia flagi UTF8 na łańcuchu znaków perl bez wykonywania natywnego kodowania do tłumaczenia UTF-X (na przykład, co dzieje się, gdy wywołujesz utf8::upgrade)?

Potrzebuję zrobić to, aby wyśledzić możliwy błąd w sterowniku DBI.

+0

Unicode i Perl jak Bonnie i Clyde - ukradł twój czas i dał ci fantastyczny wieczór i noc :) – gaussblurinc

Odpowiedz

7

To właśnie Koduje na _utf8_on robi.

use Encode qw(_utf8_on); 

my $s = "abc\xC0def"; # String to use as raw buffer content. 
utf8::downgrade($s); # Make sure each char is stored as a byte. 
_utf8_on($s);   # Set UTF8 flag. 

(Nigdy nie używaj _utf8_on wyjątkiem gdy chcesz wygenerować złe skalarne).

Można zobaczyć obrażenia używając

use Devel::Peek qw(Dump); 
Dump($s); 

wyjściowy:

SV = PV(0x24899c) at 0x4a9294 
    REFCNT = 1 
    FLAGS = (PADMY,POK,pPOK,UTF8) 
    PV = 0x24ab04 "abc\300def"\0Malformed UTF-8 character (unexpected non-continuation byte 0x64, immediately after start byte 0xc0) in subroutine entry at script.pl line 9. 
[UTF8 "abc\x{0}ef"] 
    CUR = 7 
    LEN = 12 
8

Możesz ustawić dowolną sekwencję bajtów z ustawioną flagą UTF8, która jest nadal ustawiona przez hakowanie na odwrocie łańcucha.

use Inline C; 
use Devel::Peek; 
utf8::upgrade($str = ""); 
Dump($str); 
twiddle($str, "\x{BD}\x{BE}\x{BF}\x{C0}\x{C1}\x{C2}"); 
Dump($str); 
__DATA__ 
__C__ 
/** append arbitrary bytes to a Perl scalar **/ 
void twiddle(SV *s, const char *t) 
{ 
    sv_catpv(s, t); 
} 

Typowe wyjście:

SV = PV(0x80029bb0) at 0x80072008 
    REFCNT = 1 
    FLAGS = (POK,pPOK,UTF8) 
    PV = 0x80155098 ""\0 [UTF8 ""] 
    CUR = 0 
    LEN = 12 
SV = PV(0x80029bb0) at 0x80072008 
    REFCNT = 1 
    FLAGS = (POK,pPOK,UTF8) 
    PV = 0x80155098 "\275\276\277\300\301\302"\0Malformed UTF-8 character (unexpected continuation byte 0xbd, with no preceding start byte) in subroutine entry at ./invalidUTF.pl line 6. 
Malformed UTF-8 character (unexpected continuation byte 0xbe, with no preceding start byte) in subroutine entry at ./invalidUTF.pl line 6. 
Malformed UTF-8 character (unexpected continuation byte 0xbf, with no preceding start byte) in subroutine entry at ./invalidUTF.pl line 6. 
Malformed UTF-8 character (unexpected non-continuation byte 0xc1, immediately after start byte 0xc0) in subroutine entry at ./invalidUTF.pl line 6. 
Malformed UTF-8 character (unexpected non-continuation byte 0x00, immediately after start byte 0xc2) in subroutine entry at ./invalidUTF.pl line 6. 
[UTF8 "\x{0}\x{0}\x{0}\x{0}\x{0}"] 
    CUR = 6 
    LEN = 12 
Powiązane problemy