Search code examples
phpstringutf-8word-wrapmultibyte

Multi-byte safe wordwrap() function for UTF-8


PHP's wordwrap() function doesn't work correctly for multi-byte strings like UTF-8.

There are a few examples of mb safe functions in the comments, but with some different test data they all seem to have some problems.

The function should take the exact same parameters as wordwrap().

Specifically be sure it works to:

  • cut mid-word if $cut = true, don't cut mid-word otherwise
  • not insert extra spaces in words if $break = ' '
  • also work for $break = "\n"
  • work for ASCII, and all valid UTF-8

Solution

  • This one seems to work well...

    function mb_wordwrap($str, $width = 75, $break = "\n", $cut = false, $charset = null) {
        if ($charset === null) $charset = mb_internal_encoding();
    
        $pieces = explode($break, $str);
        $result = array();
        foreach ($pieces as $piece) {
          $current = $piece;
          while ($cut && mb_strlen($current) > $width) {
            $result[] = mb_substr($current, 0, $width, $charset);
            $current = mb_substr($current, $width, 2048, $charset);
          }
          $result[] = $current;
        }
        return implode($break, $result);
    }