Unicode неизвестный "�" обнаружение символов в PHP - PullRequest
7 голосов
/ 27 декабря 2010

Есть ли в PHP способ обнаружения следующего символа ?

В настоящее время я исправляю ряд проблем с кодировкой UTF-8 с помощью нескольких различных алгоритмов и должен иметь возможность определять, присутствует ли в строке. Как мне сделать это с strpos?

Простое вставление символа в мою кодовую базу, похоже, не работает.

if (strpos($names['decode'], '?') !== false || strpos($names['decode'], '�') !== false)

Ответы [ 4 ]

17 голосов
/ 03 января 2011

Преобразование строки UTF-8 в UTF-8 с использованием iconv() с использованием параметра //IGNORE дает результат, при котором недопустимые символы UTF-8 удаляются.

Следовательно, вы можете обнаружить неработающий символ, сравнивая длину строки до и после операции iconv. Если они отличаются, они содержат неработающий символ.

Контрольный пример (убедитесь, что файл сохранен как UTF-8):

<?php

header("Content-type: text/html; charset=utf-8");

$teststring = "Düsseldorf";

// Deliberately create broken string
// by encoding the original string as ISO-8859-1
$teststring_broken = utf8_decode($teststring); 

echo "Broken string: ".$teststring_broken ;

echo "<br>";

$teststring_converted = iconv("UTF-8", "UTF-8//IGNORE", $teststring_broken );

echo $teststring_converted;

echo "<br>";

if (strlen($teststring_converted) != strlen($teststring_broken  ))
 echo "The string contained an invalid character";

теоретически, вы можете отбросить //IGNORE и просто проверить на неудачную (пустую) iconv операцию, но могут быть и другие причины сбоя iconv, кроме просто недопустимых символов ... Я не знаю. Я бы использовал метод сравнения.

3 голосов
/ 05 января 2011

Вот что я делаю, чтобы обнаружить и исправить кодирование строк, не закодированных в UTF-8, когда это то, что я ожидаю:

    $encoding = mb_detect_encoding($str, 'utf-8, iso-8859-1, ascii', true);
    if (strcasecmp($encoding, 'UTF-8') !== 0) {
      $str = iconv($encoding, 'utf-8', $str);
    }
1 голос
/ 27 декабря 2010

Насколько я знаю, этот знак вопроса не является одним символом.В стандартных наборах шрифтов есть много разных кодов символов, которые не отображаются на символ, и это символ по умолчанию, который используется.Чтобы выполнить обнаружение в PHP, вам сначала нужно знать, какой шрифт вы используете.Затем вам нужно взглянуть на реализацию шрифта и посмотреть, какие диапазоны кодов отображаются на "?"символ, а затем посмотреть, находится ли данный символ в одном из этих диапазонов.

0 голосов
/ 14 июня 2015

Я использую метод CUSTOM (используя str_replace) для очистки неопределенных символов:

    $input='a³';

    $text=str_replace("\n\n",  "sample000"        ,$text);
    $text=str_replace("\n",    "sample111"        ,$text);

    $text=filter_var($text,FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW);

    $text=str_replace("sample000",  "<br/><br/>"  ,$text);
    $text=str_replace("sample111",  "<br/>"       ,$text);

    echo $text; //outputs ------------>   a3
...