Использование заглавных латинских многобайтовых символов в PHP и вывод их как экранированных HTML - PullRequest
3 голосов
/ 10 марта 2020

Я наткнулся на проблему в PHP, и она оказывается намного труднее решить, чем я ожидал.

В версии моего сайта на Engli sh, У меня есть фрагмент открытого текста:

about-us

, который я могу легко перевести в текстовую форму с заглавной буквы:

About Us

, используя следующее:

$Text_Array = explode('-', $Plain_Text_Fragment); // ['about', 'us']

for ($i = 0; $i < count($Text_Array); $i++) {
  $Text_Array[$i] = strtoupper($Text_Array[$i][0]) . substr($Text_Array[$i], 1);
}

$Capitalised_Text = implode(' ', $Text_Array); // 'About Us'

Оказывается, не так просто превратить фрагмент открытого текста:

über-uns

в заглавную текстовую форму:

&Uuml;ber Uns

TLDR: Какой самый простой подход в PHP для достижения этой цели?


Задача № 1: выяснить, является ли первая буква многобайтовой

Мне нужно только прописать первую букву каждого слова в фрагменте открытого текста, поэтому я легко могу сказать, что фрагмент открытого текста содержит один или несколько многобайтовых символов, используя:

strlen('über') === mb_strlen('über') // FALSE

, что до сих пор не говорит мне, является ли первая буква плэй Фрагмент текста является многобайтовым или нет. (Это может быть одна или несколько других букв).

Я не могу выделить и проверить $Text_Array[$i][0], потому что, конечно, 'ü' в 'über' равно $Text_Array[$i][0] и $Text_Array[$i][1].

Также кажется, что mb_str_split() не существует.


Проблема № 2: Использование заглавных букв 'ü'

Как только я прошёл задачу # 1 (подтвердив, что первая буква 'über' является многобайтовой), мне не ясно, как ее использовать. Я хочу использовать mb_strtoupper(), но мне нужно использовать это как для $Text_Array[$i][0] и $Text_Array[$i][1], так и для других символов (если в $Text_Array[$i].

нет других многобайтовых символов). Я думаю, что могу решить Проблема # 2 примерно так:

$Text_Array[$i] = mb_strtoupper(substr($Text_Array[$i], 0, 2)) . substr($Text_Array[$i], 2);

Я проверил это, и оно определенно работает. Один вниз, два до go.


Проблема № 3: Вывод &Uuml; вместо Ü

Хотя я работаю с использованием кодировки UTF-8, я бы предпочел вывести HTML -escape &Uuml;, чем необработанный Ü. Я подумал, что будет встроенная PHP функция, которая позволит мне конвертировать между двумя:

htmlentities()

Но я действительно не могу скажите, работает htmlentities() или нет, потому что и мой DOM Inspector , и мой View Source говорят мне, что они видят Ü, а не &Uuml;. Я ценю, что они могли бы видеть последних и они просто пытаются помочь , но я не могу быть абсолютно уверен, что функция PHP htmlentities() или нет.


Вопрос:

Какой самый простой подход в PHP для преобразования:

über-uns

в:

&Uuml;ber Uns ?

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Попробуйте использовать mb_convert_case

$string = "über-uns";

$string = str_replace("-", " ", $string);

$capitalised = mb_convert_case($string, MB_CASE_TITLE, "UTF-8");

echo htmlentities($capitalised, ENT_HTML5, "UTF-8");

1 голос
/ 10 марта 2020

Вы там довольно близко, но все равно придерживайтесь функций mb_ *:

$Text_Array = explode('-', $Plain_Text_Fragment); // ['about', 'us']

for ($i = 0; $i < count($Text_Array); $i++) {
    $Text_Array[$i] = mb_strtoupper(mb_substr($Text_Array[$i],0,1)) . mb_substr($Text_Array[$i], 1);
}

$Capitalised_Text = implode(' ', $Text_Array); // 'About Us'

Проблема 1: Используйте mb_substr()

Используйте mb_substr для доступа к первому символу , Квадратная скобка будет обращаться к первому байту, а не к многобайтовой кодовой точке.

Проблема 2: Используйте mb_strtoupper()

Это не проблема, когда вы получите первый многобайтовый символ, просто придерживайтесь mb_strtoupper и у вас все хорошо.

Проблема 3: Укажите кодировку для htmlentities()

Это можно определить, указав кодировку для htmlentities, например:

htmlentities($Capitalised_Text,null,'UTF-8')

Конечно, если ваш default_charset установлен в UTF-8, вы можете пропустить это и использовать htmlentities() напрямую.

...