La página perldoc
para length() me dice que debo usar bytes::length(EXPR)
para encontrar una cadena Unicode en bytes, y la página bytes hace eco de esto.¿Cómo puedo encontrar la longitud de una cadena Unicode en Perl?
use bytes;
$ascii = 'Lorem ipsum dolor sit amet';
$unicode = 'Lørëm ípsüm dölör sît åmét';
print "ASCII: " . length($ascii) . "\n";
print "ASCII bytes: " . bytes::length($ascii) . "\n";
print "Unicode: " . length($unicode) . "\n";
print "Unicode bytes: " . bytes::length($unicode) . "\n";
La salida de este script, sin embargo, no está de acuerdo con la página de manual:
ASCII: 26
ASCII bytes: 26
Unicode: 35
Unicode bytes: 35
Me parece longitud() y los bytes :: longitud() devuelven el mismo para ambos ASCII & cadenas Unicode . Tengo mi editor configurado para escribir archivos como UTF-8 de forma predeterminada, así que creo que Perl está interpretando todo el script como Unicode. ¿Eso significa que length() maneja automáticamente las cadenas Unicode correctamente?
Editar: Ver mi comentario; mi pregunta no tiene mucho sentido, porque length() es no trabajando "correctamente" en el ejemplo anterior: muestra la longitud de la cadena Unicode en bytes, no en caracteres. El reson que originalmente tropecé con esto es para un programa en el que necesito establecer el encabezado Content-Lenth (en bytes) en un mensaje HTTP. Había leído en Unicode en Perl y esperaba tener que hacer algo de imaginación para que las cosas funcionaran, pero cuando length() devolvió exactamente lo que necesitaba del bate, ¡estaba confundido! Consulte la respuesta aceptada para obtener una descripción general de use utf8
, use bytes
y no bytes
en Perl.
No veo por qué dices que length() maneja las cadenas Unicode correctamente. En su ejemplo, length() da el mismo resultado que bytes :: length(), que es el número de bytes, no el número de caracteres (que sería el adecuado). – Inshallah
En otras palabras, length ($ unicode) interpreta la cadena como ASCII, no como unicode. – Inshallah
¡Tiene toda la razón! Había pasado por alto por completo este hecho: en mi programa, estoy usando length() para establecer el encabezado Content-Length en un mensaje HTTP, que debe estar en bytes. Después de leer los documentos de longitud(), esperaba que la función devolviera algo incorrecto, pero de hecho es exactamente lo que quiero cuando Perl está en el modo 'use bytes': la longitud de la cadena Unicode en bytes, en lugar de caracteres. –