Make WordPress Core

Changeset 53754


Ignore:
Timestamp:
07/21/2022 09:09:56 PM (22 months ago)
Author:
audrasjb
Message:

Formatting: Normalize to Unicode NFC encoding before converting accent characters in remove_accents().

This changeset adds Unicode sequence normalization from NFD to NFC, via the normalizer_normalize() PHP function which is available with the recommended intl PHP extension.

This fixes an issue where NFD characters were not properly sanitized. It also provides a unit test for NFD sequences (alternate Unicode representations of the same characters).

Props NumidWasNotAvailable, targz, nacin, nunomorgadinho, p_enrique, gitlost, SergeyBiryukov, markoheijnen, mikeschroder, ocean90, pento, helen, rodrigosevero, zodiac1978, ironprogrammer, audrasjb, azaozz, laboiteare, nuryko, virgar, dxd5001, onnimonni, johnbillion.
Fixes #24661, #47763, #35951.
See #30130, #52654.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/formatting.php

    r53455 r53754  
    15851585 * @since 5.7.0 Added locale support for `de_AT`.
    15861586 * @since 6.0.0 Added the `$locale` parameter.
     1587 * @since 6.1.0 Added Unicode NFC encoding normalization support.
    15871588 *
    15881589 * @param string $string Text that might have accent characters.
     
    15981599
    15991600    if ( seems_utf8( $string ) ) {
     1601
     1602        // Unicode sequence normalization from NFD (Normalization Form Decomposed)
     1603        // to NFC (Normalization Form [Pre]Composed), the encoding used in this function.
     1604        if ( function_exists( 'normalizer_normalize' ) ) {
     1605            if ( ! normalizer_is_normalized( $string, Normalizer::FORM_C ) ) {
     1606                $string = normalizer_normalize( $string, Normalizer::FORM_C );
     1607            }
     1608        }
     1609
    16001610        $chars = array(
    16011611            // Decompositions for Latin-1 Supplement.
  • trunk/tests/phpunit/tests/formatting/removeAccents.php

    r53562 r53754  
    1010    public function test_remove_accents_simple() {
    1111        $this->assertSame( 'abcdefghijkl', remove_accents( 'abcdefghijkl' ) );
     12    }
     13
     14    /**
     15     * @ticket 24661
     16     *
     17     * Tests Unicode sequence normalization from NFD (Normalization Form Decomposed)
     18     * to NFC (Normalization Form [Pre]Composed), the encoding used in `remove_accents()`.
     19     *
     20     * For more information on Unicode normalization, see
     21     * https://unicode.org/faq/normalization.html.
     22     *
     23     * @requires extension intl
     24     */
     25    public function test_remove_accents_latin1_supplement_nfd_encoding() {
     26        $input  = 'ªºÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ';
     27        $output = 'aoAAAAAAAECEEEEIIIIDNOOOOOOUUUUYTHsaaaaaaaeceeeeiiiidnoooooouuuuythy';
     28
     29        $this->assertSame( $output, remove_accents( $input ), 'remove_accents replaces Latin-1 Supplement with NFD encoding' );
    1230    }
    1331
Note: See TracChangeset for help on using the changeset viewer.