diff --git a/src/Models/Behaviors/HasSlug.php b/src/Models/Behaviors/HasSlug.php index b05fc8cf3..7824017b2 100644 --- a/src/Models/Behaviors/HasSlug.php +++ b/src/Models/Behaviors/HasSlug.php @@ -131,7 +131,7 @@ public function handleSlugsOnSave(): void foreach ($slugParams as $params) { if (in_array($params['locale'], config('twill.slug_utf8_languages', []))) { - $params['slug'] = $this->getUtf8Slug($params['slug']); + $params['slug'] = $this->getUtf8Slug($params['slug'], ['from_encoding' => mb_list_encodings()]); } else { $params['slug'] = Str::slug($params['slug']); } @@ -148,7 +148,7 @@ public function handleSlugsOnSave(): void public function updateOrNewSlug(array $slugParams): void { if (in_array($slugParams['locale'], config('twill.slug_utf8_languages', []))) { - $slugParams['slug'] = $this->getUtf8Slug($slugParams['slug']); + $slugParams['slug'] = $this->getUtf8Slug($slugParams['slug'], ['from_encoding' => mb_list_encodings()]); } else { $slugParams['slug'] = Str::slug($slugParams['slug']); } @@ -451,11 +451,15 @@ public function getUtf8Slug(string $str, array $options = []): string 'lowercase' => true, 'replacements' => [], 'transliterate' => true, + 'from_encoding' => null, ]; // Merge options $options = array_merge($defaults, $options); + // Make sure string is in UTF-8 and strip invalid UTF-8 characters + $str = mb_convert_encoding((string)$str, 'UTF-8', $options['from_encoding']); + $char_map = [ // Latin 'À' => 'A',