2015-12-02 1 views
1

J'imprime du texte sur un rapport PDF à l'aide de Perl. Les données proviennent d'une table de base de données Oracle. Je veux tronquer la chaîne à une taille spécifique si elle est plus longue que cette taille. J'ai essayé d'utiliser la fonction substr mais il semble que cela calcule en caractères. Je veux calculer l'espace occupé à la place. C'était ma tentative:Tronquer une chaîne en octets en Perl

$field_str .= ($totalwidth < 210) ? ' ' : "\n"; 
$field_str_trunc = substr($field_str, 0, 278); 

Cela a bien fonctionné lorsque les données étaient en majuscules; Cependant, lorsque je l'ai fait en minuscules et ajouté plus de données, pas assez de données ont été présentées sur le PDF. Comment puis-je atteindre cet objectif?

+2

Chaque élément d'une chaîne est un caractère. Ces caractères peuvent être des octets, des points de code Unicode ou n'importe quoi d'autre. /// On dirait que vous avez une chaîne de points de code Unicode, et que vous voulez limiter la taille de son encodage UTF-8. Vous n'avez pas son encodage UTF-8 de la chaîne, donc c'est la première chose à faire. – ikegami

+2

Il semble que vous vouliez tronquer à une longueur graphique particulière de la chaîne entière (en pixels ou autre), pas des octets. Chaque caractère a le même nombre d'octets (sauf pour les caractères spéciaux qui occupent 2 octets, mais généralement tous les caractères sont un seul octet). Cela ne veut pas dire qu'ils ont tous la même longueur graphique - cela dépend de la police. Vous pouvez utiliser une police de largeur fixe comme Courier pour contourner cela. Sinon, vous devrez récupérer les détails de la police afin de calculer la longueur. – hepcat72

Répondre

-1

Vous devez bytes pragma:

use utf8; 
my $str = "фуу"; 
my $chars = length($str);  # 3 
{ 
    use bytes; 
    my $bytes = length($str); # 6 
}