Проверьте юникод в PHP - PullRequest
       21

Проверьте юникод в PHP

16 голосов
/ 29 августа 2009

Как я могу проверить, является ли символ символом Unicode или нет в PHP?

Ответы [ 6 ]

26 голосов
/ 29 августа 2009

На самом деле вам даже не нужно расширение mb_string:

if (strlen($string) != strlen(utf8_decode($string)))
{
    echo 'is unicode';
}

И найти кодовую точку заданного символа:

$ord = unpack('N', mb_convert_encoding($string, 'UCS-4BE', 'UTF-8'));

echo $ord[1];
5 голосов
/ 29 августа 2009

вы можете попробовать с

mb_check_encoding($s,"UTF-8")

ссылка

2 голосов
/ 29 августа 2009

Обычно вы делаете что-то вроде:

if (mb_strlen($ch) != strlen($ch)) ...

Я должен добавить: strlen подсчитывает байты, в то время как mb_strlen подсчитывает символы (правильная обработка многобайтовых символов, что, я думаю, то, о чем вы говорите, а не юникод - поскольку юникод также охватывает более ста однобайтовых символов, неразличимых из ASCII)

1 голос
/ 29 августа 2009

Строки в PHP - это потоки байтов, а не символьные потоки. На самом деле вы не можете иметь строки Unicode в PHP; Вы должны закодировать свои символы с некоторой кодировкой. Если вы хотите охватить весь диапазон Unicode, UTF-8 является наиболее очевидным выбором.

Если вы хотите получить кодовую точку потока utf-8, закодированного потоком, вы можете использовать эту библиотеку: http://hsivonen.iki.fi/php-utf8/

Однако мне интересно, для чего именно это нужно? Скорее всего, вы можете решить все свои проблемы, просто используя utf-8.

1 голос
/ 29 августа 2009

Спасибо, ребята .. Наконец-то я получил ответ, который искал.

Получил включаемый файл из http://hsivonen.iki.fi/php-utf8/.

Следующий код решил мою проблему:

<?php
  require_once("utf8.inc");
  /*** create a unicode string ***/
  $s = "حملة إلا صلاتي";
  $out = utf8ToUnicode($s);
  for ($i=0;$i < strlen($s);$i++)
    echo dechex($out[$i]).".";
?>
1 голос
/ 29 августа 2009

Unicode-символ ВСЕГДА будет иметь самый значительный набор байтов, независимо от того, какое значение имеет символ или является ли он частью многобайтового символа Unicode или чем. Вы не можете просто проверить, содержит ли строка больше байтов, чем символов, поскольку некоторые символы Юникода имеют только один байт. Если какой-либо символ в байтовом значении строки больше 127, эта строка содержит юникод.

...