This is a follow-up from https://www.drupal.org/node/2572699#comment-12271753.

The line:
while (--$len >= 0 && ord($string[$len]) >= 0x80 && ord($string[$len]) < 0xC0);
should be more readable.

CommentFileSizeAuthor
#3 2911497_3.patch755 bytesMile23
Support from Acquia helps fund testing for Drupal Acquia logo

Comments

mfernea created an issue. See original summary.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.0-alpha1 will be released the week of January 17, 2018, which means new developments and disruptive changes should now be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Mile23’s picture

Title: core/lib/Drupal/Component/Utility/Unicode.php - unreadable code » Make Drupal/Component/Utility/Unicode more readable (cleanup)
Status: Active » Needs review
FileSize
755 bytes

Replaced side-effects with do-while.

dawehner’s picture

I don't think we should have to do that. #2849669: Fix \Drupal\Component\Utility\Unicode() because of the Symfony mbstring polyfill will basically empty this file completely.

alexpott’s picture

Well \Drupal\Component\Utility\Unicode::truncateBytes() has no mb_* equivalent so I guess this issue can proceed.

borisson_’s picture

Status: Needs review » Reviewed & tested by the community

While this is more readable, I still wouldn't call this simple. However, it is better compared to the situation we had before.

This method has specific unit test coverage that confirms this still works.
That means this can go to RTBC, also based on #5's answer to #4.

alexpott’s picture

Status: Reviewed & tested by the community » Needs work
Issue tags: +Needs followup, +Needs tests

I've added some test cases and found a bug in the difference between the way this works for unicode and non-unicode characters.

diff --git a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
index 960d1812ad..9cbc3ec576 100644
--- a/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
+++ b/core/tests/Drupal/Tests/Component/Utility/UnicodeTest.php
@@ -472,8 +472,13 @@ public function providerTestTruncateBytes() {
       ['Short string', 42, 'Short string'],
       // Simple string longer than max length.
       ['Longer string than previous.', 10, 'Longer str'],
+      ['Longer string than previous.', -4, 'Longer string than previ'],
+      ['Longer string than previous.', 0, ''],
       // Unicode.
       ['以呂波耳・ほへとち。リヌルヲ。', 10, '以呂波'],
+      ['以呂波耳・ほへとち。リヌルヲ。', 2, ''],
+      ['以呂波耳・ほへとち。リヌルヲ。', 3, '以'],
+      ['以呂波耳・ほへとち。リヌルヲ。', -10, '以呂波耳・ほへとち。リ�'],
     ];
   }

I think we should add the following test cases here:

+      ['以呂波耳・ほへとち。リヌルヲ。', 2, ''],
+      ['以呂波耳・ほへとち。リヌルヲ。', 3, '以'],

because this explicitly proves the counting backwards is working. I also think we should create a followup to fix the bug when

   * @param int $len
   *   An upper limit on the returned string length.

is set to a negative number. In that issue we should discuss what to do. I think it might be correct just to ensure that $len is positive and deprecate the incorrect negative behaviour. As you can see from the negative behaviour test for unicode it currently incorrectly chops up the string resulting in a � character.

Version: 8.6.x-dev » 8.7.x-dev

Drupal 8.6.0-alpha1 will be released the week of July 16, 2018, which means new developments and disruptive changes should now be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.7.x-dev » 8.8.x-dev

Drupal 8.7.0-alpha1 will be released the week of March 11, 2019, which means new developments and disruptive changes should now be targeted against the 8.8.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.0-alpha1 will be released the week of October 14th, 2019, which means new developments and disruptive changes should now be targeted against the 8.9.x-dev branch. (Any changes to 8.9.x will also be committed to 9.0.x in preparation for Drupal 9’s release, but some changes like significant feature additions will be deferred to 9.1.x.). For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.1.x-dev

Drupal 8.9.0-beta1 was released on March 20, 2020. 8.9.x is the final, long-term support (LTS) minor release of Drupal 8, which means new developments and disruptive changes should now be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 9.1.x-dev » 9.2.x-dev

Drupal 9.1.0-alpha1 will be released the week of October 19, 2020, which means new developments and disruptive changes should now be targeted for the 9.2.x-dev branch. For more information see the Drupal 9 minor version schedule and the Allowed changes during the Drupal 9 release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Drupal 9.2.0-alpha1 will be released the week of May 3, 2021, which means new developments and disruptive changes should now be targeted for the 9.3.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.0-rc1 was released on November 26, 2021, which means new developments and disruptive changes should now be targeted for the 9.4.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.0-alpha1 was released on May 6, 2022, which means new developments and disruptive changes should now be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 10.1.x-dev

Drupal 9.5.0-beta2 and Drupal 10.0.0-beta2 were released on September 29, 2022, which means new developments and disruptive changes should now be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 10.1.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch, which currently accepts only minor-version allowed changes. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.