php проблема при обращении к строке как к масиву

12
V
На сайте с 10.01.2012
Offline
85
1643

Суть проблемы такова. Есть данные которые передаются методом GET.

При получении вот что имею

UTF-8 | $str = йцукенгшАБВГДЕЭЖЗ

UTF-8 | $str[1] = �

Тоесть - сама строка выводится нормально, а если обратится к некоторому символу по номеру как к элементу массива, то выводятся знаки вопроса.

Никто не подскажет в чем может быть причина?

Mad_Man
На сайте с 10.11.2008
Offline
162
#1

В пыхе отсутствует поддержка UTF-8 по дефолту, все стандартные обращения к строкам идут как к однобайтовой кодировке. Ниже куски кода с примерами из моей либы, можете организовать доступ по аналогии, вызывая метод `char`.


/**
* @en Return specific character from the string
* @ru Возвращает указанный символ из строки
*
* $string_ASCII = 'ASCII string example'; # string(20) "ASCII string example"
* $string_UTF8 = 'UTF-8 string πράδειγμα'; # string(31) "UTF-8 string πράδειγμα"
*
* $char = string::char($string_ASCII, 14); # string(1) "e"
* $char = string::char($string_ASCII, 15); # string(1) "x"
* $char = string::char($string_ASCII, 16); # string(1) "a"
*
* $char = string::char($string_UTF8, 14); # string(2) "π"
* $char = string::char($string_UTF8, 15); # string(2) "ρ"
* $char = string::char($string_UTF8, 16); # string(2) "ά"
*
* @param string $string Any string
* @param int $number Character number in the range from 1 to n (string length)
*
* @return string
*/
public static function char($string, $number)
{
return string::read($string, 1, $number - 1);
}


/**
* @en Return part of a string with a specific length in characters
* @ru Возвращает часть строки с указанной длиной и смещением
*
* $string_ASCII = 'ASCII string example'; # string(20) "ASCII string example"
* $string_UTF8 = 'UTF-8 string πράδειγμα'; # string(31) "UTF-8 string πράδειγμα"
*
* $result = string::read($string_ASCII, 5, 13); # string(5) "examp"
* $result = string::read($string_UTF8, 5, 13); # string(10) "πράδε"
*
* @param string $string Any string
* @param int $length Substring length to read
* @param int $offset String offset
*
* @return string
*/
public static function read($string, $length = null, $offset = 0)
{
if (string::is_utf8($string))
{
return mb_substr($string, $offset, $length, 'UTF-8');
}

return substr($string, $offset, $length);
}


/**
* @en Detect charset of string
* @ru Определяет кодировку строки
*
* $is_utf8 = string::is_utf8('ABCDEFАБВГДЕ'); # bool(true)
*
* @param $string
*
* @return bool
*/
public static function is_utf8($string)
{
########################################################################################
# 1. Any UTF8 string is a valid 8-bit encoding string (even if it produces gibberish); #
# 2. On the other hand, most 8-bit encoded strings with extended (128+) characters are #
# not valid UTF8, but, as any other random byte sequence, they might happen to be; #
# 3. Of course, any ASCII text is valid UTF8; #
# 4. Native mb_detect_encoding() is slow. #
########################################################################################

if (preg_match('//u', $string))
{
return true; # it's UTF-8
}

return false; # it's something else
}
V
На сайте с 10.01.2012
Offline
85
#2

По сули то проблему решил, изловчившись таким способом substr($str, 0, 1)

но теперь беда - не работает с str_replace($start, substr($str, 0, 1), $line);

A
На сайте с 19.07.2010
Offline
130
#3

mbstring

а что Вы хотите сделать? возможно есть более прямой вариант.

.............
Mad_Man
На сайте с 10.11.2008
Offline
162
#4
Varenik:
substr($str, 0, 1)

Тогда уже лучше mb_substr().

Varenik:
но теперь беда - не работает с str_replace($start, substr($str, 0, 1), $line);

А что конкретно вы хотите сделать?

TF-Studio
На сайте с 17.08.2010
Offline
334
#5

MB_ юзайте

Всё ещё лучший способ заработка для белых сайтов: GoGetLinks (https://www.gogetlinks.net/?inv=fahbn8).
V
На сайте с 10.01.2012
Offline
85
#6
Mad_Man:
Тогда уже лучше mb_substr().
А что конкретно вы хотите сделать?

в бланк на HTML (струкура считывается с файла и после обработки записывается в новый) нужно заменой посимвольно заменить вхождения в шаблоне HTML

$str = $_GET['str'];

#0#, #1#, #2#, .... #n#

на

$str[0], $str[1]$, str[2], ... $str[n]

По GET передается строка с русскими символами

Mad_Man
На сайте с 10.11.2008
Offline
162
#7

Получение массива валидных символов в помощь. И погуглите всё же на тему mbstring.


/**
* @en Convert a string to an array of chars
* @ru Преобразует строку в массив символов
*
* $string_ASCII = 'ASCII string example'; # string(20) "ASCII string example"
* $string_UTF8 = 'UTF-8 string πράδειγμα'; # string(31) "UTF-8 string πράδειγμα"
*
* $chars = string::chars($string_ASCII); # Array
* # (
* # [0] => A
* # [1] => S
* # [2] => C
* # [3] => I
* # [4] => I
* # [5] =>
* # [6] => s
* # [7] => t
* # [8] => r
* # [9] => i
* # [10] => n
* # [11] => g
* # [12] =>
* # [13] => e
* # [14] => x
* # [15] => a
* # [16] => m
* # [17] => p
* # [18] => l
* # [19] => e
* # )
*
* $chars = string::chars($string_UTF8); # Array
* # (
* # [0] => U
* # [1] => T
* # [2] => F
* # [3] => -
* # [4] => 8
* # [5] =>
* # [6] => s
* # [7] => t
* # [8] => r
* # [9] => i
* # [10] => n
* # [11] => g
* # [12] =>
* # [13] => π
* # [14] => ρ
* # [15] => ά
* # [16] => δ
* # [17] => ε
* # [18] => ι
* # [19] => γ
* # [20] => μ
* # [21] => α
* # )
*
* @param string $string Any string
*
* @return array
*/
public static function chars($string)
{
if (string::is_utf8($string))
{
return preg_split('/(?<!^)(?!$)/u', $string);
}

return str_split($string, 1);
}
V
На сайте с 10.01.2012
Offline
85
#8

Mad_Man, Увы у меня не настолько глубокие познания в php, но исходя из вашего кода понял что мне нужно к примеру

'ы' заменить на 'ы' - в этом логики не вижу

Mad_Man
На сайте с 10.11.2008
Offline
162
#9
Varenik:
Mad_Man, Увы у меня не настолько глубокие познания в php, но исходя из вашего кода понял что мне нужно к примеру
'ы' заменить на 'ы' - в этом логики не вижу

http://www.studfiles.ru/dir/cat32/subj58/file8435.html

Страницы 151-155.

totamon
На сайте с 12.05.2007
Offline
437
#10

  

$arr = preg_split('/(?!^)(?=.)/u', $str);

$arr = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);

вот 2 варианта, в инете нарыл когда такая проблема стояла тоже

Домены и хостинг https://8fn.ru/regru | Дедик от 3000р https://8fn.ru/73 | VPS в Москве https://8fn.ru/72 | Лучшие ВПС, ТП огонь, все страны! https://8fn.ru/inferno | ХОСТИНГ №1 РОССИИ https://8fn.ru/beget
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий