diff options
author | Karl Williamson <public@khwilliamson.com> | 2013-05-18 08:25:16 -0600 |
---|---|---|
committer | Karl Williamson <public@khwilliamson.com> | 2013-05-20 11:01:52 -0600 |
commit | 1ca267a56acf698557ec1deec44af651acc88696 (patch) | |
tree | 007f9d40b63b92728a095d5defdad663e239289c /t | |
parent | 519101418837cf0edacb710b2b38b42dad6e47c1 (diff) | |
download | perl-1ca267a56acf698557ec1deec44af651acc88696.tar.gz |
Fix multi-char fold edge case
use locale;
fc("\N{LATIN CAPITAL LETTER SHARP S}")
eq 2 x fc("\N{LATIN SMALL LETTER LONG S}")
should return true, as the SHARP S folds to two 's's in a row, and the
LONG S is an antique variant of 's', and folds to s. Until this commit,
the expression was false.
Similarly, the following should match, but didn't until this commit:
"\N{LATIN SMALL LETTER SHARP S}" =~ /\N{LATIN SMALL LETTER LONG S}{2}/iaa
The reason these didn't work properly is that in both cases the actual
fold to 's' is disallowed. In the first case because of locale; and in
the second because of /aa. And the code wasn't smart enough to realize
that these were legal.
The fix is to special case these so that the fold of sharp s (both
capital and small) is two LONG S's under /aa; as is the fold of the
capital sharp s under locale. The latter is user-visible, and the
documentation of fc() now points that out. I believe this is such an
edge case that no mention of it need be done in perldelta.
Diffstat (limited to 't')
-rw-r--r-- | t/uni/fold.t | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/t/uni/fold.t b/t/uni/fold.t index 91356bbe18..6c06a2fdc2 100644 --- a/t/uni/fold.t +++ b/t/uni/fold.t @@ -444,6 +444,12 @@ foreach my $test_ref (@CF) { } } +{ + use feature qw( fc ); + use locale; + is(fc("\x{1E9E}"), fc("\x{17F}\x{17F}"), 'fc("\x{1E9E}") eq fc("\x{17F}\x{17F}")'); +} + my $num_tests = curr_test() - 1; plan($num_tests); |