Вопросы PHP UTF-8 - Если я создаю строку в PHP ... это в UTF-8? - PullRequest
3 голосов
/ 17 февраля 2009

В PHP, если я создаю строку, подобную этой:

$str = "bla bla here is my string";

Смогу ли я затем использовать функции mbstring для работы с этой строкой как UTF8?

// Will this work?
$str = mb_strlen($str); 

Кроме того, если у меня есть еще одна строка, которую я знаю, - это UTF-8 (скажем, это было значение формы POST или UTF-8 из базы данных), могу ли я объединить эти две а проблем нет?

// What about this, will this work? 
$str = $str . $utf8_string_from_database;

Ответы [ 3 ]

10 голосов
/ 17 февраля 2009

Первый вопрос: это зависит от того, что именно входит в строку.

В PHP (до PHP5, в любом случае) строки - это просто последовательности байтов. Нет никакого подразумеваемого или явного набора символов, связанного с ними; это то, что программист должен отслеживать. Таким образом, если вы поместите в кавычки только допустимые байты UTF-8 (довольно просто, если сам файл закодирован как UTF-8), тогда строка будет UTF-8, и вы можете безопасно использовать mb_strlen () для нее.

Кроме того, если вы используете функции mbstring, вам необходимо явно указать, какой набор символов используется в вашей строке, либо с mbstring.internal_encoding , либо в качестве последнего аргумента любой функции mbstring.

Второй вопрос: да, с оговорками.

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

3 голосов
/ 17 февраля 2009

Если ваш исходный код находится в UTF-8, то строка в UTF-8, если нет - это не так. Так как ваш пример строки только на английском языке, это действительно UTF-8.

PHP сам не знает о кодировках. Если вы передаете материал в функцию mb *, он обрабатывает ее как строку UTF-8.

Конкатенация должна работать безотносительно, если я правильно понимаю UTF-8 :-) Просто убедитесь, что обе строки имеют UTF-8, иначе вы получите странную строку результат.

2 голосов
/ 17 февраля 2009

Убедитесь, что ваша директива default_charset установлена ​​в UTF-8, прежде чем произойдет любое из этого выполнения.

Либо измените php.ini напрямую, либо сделайте это во время выполнения с помощью

<?php

ini_set( 'default_charset', 'UTF-8' );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...