2010-07-20 4 views
3

Je veux implémenter mon propre tweet compressor. Fondamentalement, cela fait ce qui suit. Cependant, je suis coincé avec certains des problèmes Unicode.Un 'tweet compressor' basé sur Unicode en Perl

Voici mon script:

#!/usr/bin/env perl 
use warnings; 
use strict; 

print tweet_compress('cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, "\. " ,", "'),"\n"; 

sub tweet_compress { 
    my $tweet = shift; 
    $tweet =~ s/\. ?$//; 
    my @orig = (qw/cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, ". " ,", "); 
    my @new = qw/㏄ ㎳ ㎱ ㎰ ㏌ ʪ fi fl ffl ffi ⅳ ⅸ ⅵ ѹ ⅱ ⅺ nj . ,/; 
    $tweet =~ s/$orig[$_]/$new[$_]/g for 0 .. $#orig; 
    return $tweet; 
} 

Mais imprime jonque au terminal:

?.?.?.?.?.?.?.f.?.f?.?.?.?.?.?.?.nj/."\..,"." 

Qu'est-ce que je fais mal?

+0

* cringe * Quel abus de Unicode est-ce? – Thanatos

+1

D'accord. Piratage méprisable :). De plus, si vous avez l'intention de stocker cela, il faudra plus d'espace car beaucoup de ces caractères prennent 3 octets dans utf8. par exemple. cc prendrait 2 octets mais ㏄ serait 3 octets 0xE3 0x8F 0x84. Sans compter que le tweet va casser sur beaucoup de téléphones mobiles (certains d'entre nous utilisent SMS pour obtenir des tweets). – deepakg

+1

Eh bien le fait est que les glyphes utf8 sont comptés comme un personnage pour le but de Twitter, donc en fonction du nombre de caractères spéciaux que vous obtenez dans votre tweet, il vous donne une bande passante accrue. 140 caractères en chinois ou japonais script est beaucoup plus de 140 caractères anglais;) – singingfish

Répondre

6

Deux numéros.

Tout d'abord, vous avez des caractères Unicode dans votre code source. Assurez-vous que vous enregistrez votre fichier comme utf8 et utilisez l'utilisation utf8 pragma.

De même, si vous avez l'intention d'exécuter ce programme à partir d'une console, assurez-vous qu'il peut gérer unicode. L'invite de commande Windows ne peut pas et s'affichera toujours? peu importe si vos données sont correctes ou non. J'ai couru ceci sur Mac OS avec Terminal configuré pour gérer utf8.

Deuxièmement, si vous avez "." dans votre liste orig, il sera interprété comme "n'importe quel caractère" et vous donnera des résultats erronés - vous devez donc y échapper avant de l'utiliser dans votre expression régulière. J'ai modifié un peu le programme pour le faire fonctionner.

#!/usr/bin/env perl 
use warnings; 
use strict; 
use utf8; #use character semantics 

#make sure the data is re-encoded to utf8 when output to terminal 
binmode STDOUT, ':utf8'; 

print tweet_compress('cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, "\. " ,", "'),"\n"; 

sub tweet_compress { 
    my $tweet = shift; 
    $tweet =~ s/\. ?$//; 
    my @orig = (qw/cc ms ns ps in ls fi fl ffl ffi iv ix vi oy ii xi nj/, '\. ' ,", "); 
    my @new = qw/㏄ ㎳ ㎱ ㎰ ㏌ ʪ fi fl ffl ffi ⅳ ⅸ ⅵ ѹ ⅱ ⅺ nj . ,/; 
    $tweet =~ s/$orig[$_]/$new[$_]/g for 0 .. $#orig; 
    return $tweet; 
} 
+0

Vous avez une erreur sur la ligne 'binmode' - ressemble au mot" console "a été laissé derrière une modification précédente. –

+0

Merci. Je l'ai réparé. – deepakg

+0

N'échappe pas manuellement à '@ orig', il suffit d'utiliser' quotemeta' (ou '\ Q' dans le' s /// ') :) – hobbs

Questions connexes