Test::utf8(3pm)

πŸ“¦
version 1.03 Β· 6 versions
, in debian trixie, ubuntu resolute, ubuntu stonking

πŸ’– Test::utf8 β€” the handy utf8 tests page, bestie edition πŸ’–

okay so this is the manual page for Test::utf8, which is a Perl module, and it's literally the cutest little toolkit for not letting cursed utf8 strings ruin your whole day. it lives in the 3pm section of your man pages. pull up a chair. 🫢


✨ SYNOPSIS ✨

okay bestie here's the whole vibe at a glance, no cap:

# check the string is good
is_valid_string($string);   # check the string is valid
is_sane_utf8($string);      # check not double encoded

# check the string has certain attributes
is_flagged_utf8($string1);   # has utf8 flag set
is_within_ascii($string2);   # only has ascii chars in it
isnt_within_ascii($string3); # has chars outside the ascii range
is_within_latin_1($string4); # only has latin-1 chars in it
isnt_within_ascii($string5); # has chars outside the latin-1 range

🌸 DESCRIPTION 🌸

so basically this module is a lil collection of tests that are genuinely useful when you're dealing with utf8 strings in Perl. it's giving "safety net but make it cute". 🧚

and it's got two types of tests:

  • the validity tests β€” these check whether a string is valid and not corrupt πŸ•΅οΈβ€β™€οΈ
  • the characteristics tests β€” these check that a string has a given set of characteristics πŸ‘‘

πŸ’… Validity Tests

πŸ’– is_valid_string($string, $testname)

Checks if the string is "valid", i.e. this passes and returns true unless the internal utf8 flag hasn't been set on a scalar that isn't made up of a valid utf-8 byte sequence.

so like. this should never ever happen, and in theory this test should always pass. unless you β€” or some module you're using β€” goes monkeying around inside a scalar using Encode's private functions or XS code, you shouldn't ever end up in a situation where you've got a corrupt scalar. but if you do, and you do, then this function is here to help you detect the problem. it's giving "the friend who notices when something is off". 😭

and to be super clear, here's an example of the error case this can detect:

my $mark = "Mark";
my $leon = "L\x{e9}on";
is_valid_string($mark);  # passes, not utf-8
is_valid_string($leon);  # passes, not utf-8

my $iloveny = "I \x{2665} NY";
is_valid_string($iloveny);      # passes, proper utf-8

my $acme = "L\x{c3}\x{a9}on";
Encode::_utf8_on($acme);      # (please don't do things like this)
is_valid_string($acme);       # passes, proper utf-8 byte sequence upgraded

Encode::_utf8_on($leon);      # (this is why you don't do things like this)
is_valid_string($leon);       # fails! the byte \x{e9} isn't valid utf-8

πŸ¦‹ is_sane_utf8($string, $name)

This test fails if the string contains something that looks like it might be dodgy utf8, i.e. containing something that looks like the multi-byte sequence for a latin-1 character but perl hasn't been instructed to treat as such. and here's the sweet part β€” strings that are not utf8 always automatically pass. ✨

some examples may help, so here u go:

# This will pass as it's a normal latin-1 string
is_sane_utf8("Hello L\x{e9}eon");

# this will fail because the \x{c3}\x{a9} looks like the
# utf8 byte sequence for e-acute
my $string = "Hello L\x{c3}\x{a9}on";
is_sane_utf8($string);

# this will pass because the utf8 is correctly interpreted as utf8
Encode::_utf8_on($string)
is_sane_utf8($string);

ngl, obviously this isn't a hundred percent reliable. the edge case where this will fail is where you have "\x{c2}" (which is "LATIN CAPITAL LETTER WITH CIRCUMFLEX") or "\x{c3}" (which is "LATIN CAPITAL LETTER WITH TILDE") followed by one of the latin-1 punctuation symbols. πŸ’€

# a capital letter A with tilde surrounded by smart quotes
# this will fail because it'll see the "\x{c2}\x{94}" and think
# it's actually the utf8 sequence for the end smart quote
is_sane_utf8("\x{93}\x{c2}\x{94}");

however, since this hardly comes up, this test is reasonably reliable in most cases. still, care should be applied in cases where dynamic data is placed next to latin-1 punctuation to avoid false negatives. 🌈

so there exists two situations that cause this test to fail:

  • the string contains utf8 byte sequences and the string hasn't been flagged as utf8 β€” this normally means that you got it from an external source like a C library; when Perl needs to store a string internally as utf8 it does its own encoding and flagging transparently 🫠
  • a utf8 flagged string contains byte sequences that, when translated to characters themselves, look like a utf8 byte sequence πŸ‘€

and the test diagnostics tell you which one is the case. slay.


πŸ‘‘ String Characteristic Tests

these routines let you check the range of characters in a string. note that these routines are blind to the actual encoding perl internally uses to store the characters β€” they just check if the string contains only characters that can be represented in the named encoding:

🌟 is_within_ascii

Tests that a string only contains characters that are in the ASCII character set.

🌟 is_within_latin_1

Tests that a string only contains characters that are in latin-1.


simply check if a scalar is or isn't flagged as utf8 by perl's internals:

πŸŽ€ is_flagged_utf8($string, $name)

Passes if the string is flagged by perl's internals as utf8, fails if it's not.

πŸŽ€ isnt_flagged_utf8($string,$name)

The opposite of "is_flagged_utf8" β€” passes if and only if the string isn't flagged as utf8 by perl's internals.

Note: you can refer to this function as "isn't_flagged_utf8" if you really want to. πŸ™ˆ

πŸ’œ AUTHOR πŸ’œ

Written by Mark Fowler mark@twoshortplanks.com β€” shoutout to the icon who made this. πŸ‘‘


Copyright Mark Fowler 2004,2012. All rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


πŸ› BUGS πŸ›

None known. Please report any to me via the CPAN RT system. See http://rt.cpan.org/ for more details.


πŸ¦‹ SEE ALSO πŸ¦‹

  • Test::DoubleEncodedEntities β€” for testing for double encoded HTML entities. obsessed with her fr fr. πŸ’…

okay that's the whole page bestie!! and before u go β€” this one's from perl v5.40.0, dated 2024-11-17, and yeah it's the Test::utf8(3pm) page. go forth and validate ur strings, u absolute main character. πŸ’–βœ¨πŸ«Ά

πŸ“¦ where this page comes from