Символы все еще существуют в декодированной строке string 'x9gtjw91ffd092K' (length=17)
, но они не отображаются. 1D - управляющий код ASCII для разделителя групп (непечатный символ).
Обратите внимание, что размер длины строки в два раза больше (17), чем отображаемая строка (15), поскольку символ UTF-8 равен \x1d
и в строке два символа.
Если бы символ был: \u0A1
(Upsidedown Exclamation Point), версия UTF-8 добавила бы 2 дополнительных байта (\xc2\xa1
). Это может существовать до 4 дополнительных байтов (более высокий эмодзи UTF-32).
Ваше сравнение не работает, потому что:
Вы должны удвоить двойную обратную косую черту \\\\
, чтобы избежать кодировки Unicode.
$s = '{"code":"zz\\\\u001d"}';
$json = json_decode($s);
if($json->code == 'zz\u001d') {...}
в противном случае \u001d
будет интерпретироваться при декодировании.
Здесь объясняется более естественный способ сделать это (не то, что спрашивали, но все же как решение):
PHP требует двойных кавычек ", когда он содержит escape-последовательности \uXXXX
. Ссылка (раздел" Двойные кавычки ", 1 страница вниз) .
Просто измените свой код обнаружения, следуя этому требованию:
$s = '{"code":"zz\u001d"}';
$json = json_decode($s);
if($json->code == "zz\u001d") {...}
Код, указанный в {...}
, теперь будет работать.