Какая кодировка является результирующей строкой, если я конкатенирую строку в кодировке UTF-8 со строкой ASCII в PHP? - PullRequest
0 голосов
/ 29 января 2019

Если я использую функцию mb_convert_encoding() для преобразования строки в кодировке ASCII в PHP в строку UTF-8, затем объединяю ее со строкой в ​​кодировке ASCII, что это за кодировка?Есть ли какие-либо негативные последствия для этого?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Во-первых, это будет зависеть от того, имеете ли вы в виду строгий ASCII , который содержит только 128 символов.Каждый из этих символов имеет ту же самую кодировку в схеме кодирования ASCII, что и в схеме кодирования UTF-8 .Для этих символов функция mb_convert_encoding не будет иметь никакого эффекта.Вы можете легко проверить это самостоятельно с помощью этого сценария:

/* Convert ASCII to UTF-8 */
for ($i=0; $i<128; $i++) {
        $str1 = chr($i);
        $str2 = mb_convert_encoding($str1, "UTF-8", "ASCII");

        echo $str1 . " - " . $str2 . " - ";

        if ($str1 !== $str2) {
                echo " - DIFFERENT!";
        } else {
                echo " - same";
        }
        echo "\n";
}

Для всех этих true ASCII-символов нет смысла перекодировать их.

ОДНАКО, если под "ASCII" вы имеете в виду расширенный ASCII (см. здесь ) и говорите о персонажах с акцентами и прочим, то у вас возникают проблемы, потому что там не является определенным набором символов, описанным этим термином .Вы заметите, что в списке поддерживаемых кодировок символов для расширения многобайтовой строки в php есть только одно вхождение аббревиатуры ASCII, и это касается самого ASCII.

Чтобы ответить на ваши вопросы подробнееа именно:

Если я использую функцию mb_convert_encoding () для преобразования строки в кодировке ASCII в PHP в строку в кодировке UTF-8, затем объединяю ее со строкой в ​​кодировке ASCII, какая это кодировка?

Результирующая строка оба ASCII и UTF-8, потому что обе схемы кодирования используют одинаковые байтовые кодировки для этих 128 символов.

Есть ли какие-либо негативные последствия для этого?

Ни при каких обстоятельствах не должно быть никаких негативных последствий, если символы на самом деле true ASCII-символы.

Если, с другой стороны, строки содержат какой-либо акцентированный символ, такой как Å или х , и какой-то неаккуратный кодер вызывает это «расширенный AS»CII "тогда у вас могут быть проблемы.Эти символы имеют разные кодировки, например, в схемах кодирования latin-1 и UTF-8.

Подумайте, взгляните на эту функцию php, и она может потерять некоторое понимание.Спросите себя, что значит преобразовать символ, который НЕ является ASCII, из ASCII в UTF-8 .Это не значимое преобразование, но оно приводит к изменению в этом конкретном сценарии:

$chars = array("Å", "õ");
foreach ($chars as $char) {
        echo $char . " : ";
        $str1 = mb_convert_encoding($str1, "UTF-8", "ASCII");
        $str2 = mb_convert_encoding($str1, "UTF-8", "ISO-8859-1");
        echo $str1 . " - " . $str2 . " - ";

        if ($char !== $str1) {
                echo " - ASCII DIFFERENT";
        }
        if ($char !== $str2) {
                echo " - LATIN 1 DIFFERENT";
        }
        echo "\n";
}

В этот момент вы можете запутаться.Возможно, вам будет полезно узнать, что мой PHP-код в этой последней функции имеет свою собственную кодировку , которая на моей рабочей станции оказывается utf-8.Эти преобразования, которые я выполнил, довольно глупы.Я лгу PHP, говоря, что эти строки UTF-8 являются ASCII или Latin-1, и прошу PHP преобразовать их в UTF-8.Он выполняет преобразование настолько хорошо, насколько это возможно, но мы все знаем, что преобразование не имеет смысла.

Я надеюсь, вы сможете оценить то, к чему я здесь прихожу.Каждый раз, когда вы видите символ на компьютере, он имеет некоторую кодировку.Существуют ли какие-либо негативные последствия, будет зависеть от того, как вы относитесь к поступающим вам данным, какие преобразования вы выполняете с ними и что вы намерены делать с ними позже.

Полезно подумать оцепочка поставок.Откуда ваши данные?Какую кодировку они использовали?Это то, что я использую в моей системе?Куда я отправляю эти данные?Это должно быть преобразовано?Вы также должны быть осторожны, чтобы указывать наборы символов для всех этих вещей:

  • данных, которые вы получаете от клиентов
  • формы представления на ваш сайт
  • отображение html на вашемвеб-сайт
  • операции с текстовыми строками в ваших приложениях
  • кодировка символов вашего соединения с базой данных, кодировка символов таблиц в вашей базе данных и кодировки столбцов в этих таблицах
  • кодировка символов хранимых данных
  • кодировка символов электронной почты
  • кодировка символов данных, передаваемых в API

и так далее.

Общее правило: используйте utf-8 для всего, что вы можете.

0 голосов
/ 30 января 2019

ASCII является подмножеством UTF-8, поэтому строка ASCII является допустимой строкой UTF-8.Конкатенация двух строк UTF-8 однозначна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...