Первый вопрос: это зависит от того, что именно входит в строку.
В PHP (до PHP5, в любом случае) строки - это просто последовательности байтов. Нет никакого подразумеваемого или явного набора символов, связанного с ними; это то, что программист должен отслеживать. Таким образом, если вы поместите в кавычки только допустимые байты UTF-8 (довольно просто, если сам файл закодирован как UTF-8), тогда строка будет UTF-8, и вы можете безопасно использовать mb_strlen () для нее.
Кроме того, если вы используете функции mbstring, вам необходимо явно указать, какой набор символов используется в вашей строке, либо с mbstring.internal_encoding , либо в качестве последнего аргумента любой функции mbstring.
Второй вопрос: да, с оговорками.
Две строки, которые являются независимо действительными UTF-8, могут быть безопасно побайтно сцеплены (как с оператором PHP .
) и при этом оставаться действительными UTF-8. Тем не менее, вы никогда не можете быть уверены, не выполнив некоторую работу самостоятельно, что строка POSTed является допустимой UTF-8. Строки базы данных немного проще, если вы тщательно установите набор символов соединения, потому что большинство СУБД выполнят любое преобразование за вас.