Я пытаюсь извлечь n символов из строки, используя
substr($originalText,0,250)
;
Девятый символ — это тире. Таким образом, я получаю последний символ как … когда я просматриваю его в блокноте. В моем редакторе Brackets я даже не могу открыть файл журнала, так как он поддерживает только кодировку UTF-8.
Я также не могу запустить json_encode для этой строки.
Тем не менее, когда я использую substr($originalText,0,251)
, это работает просто отлично. Я могу открыть файл журнала, и он показывает вместо черты значок «â €». json_encode также отлично работает.
я могу использовать mb_convert_encoding($mystring, "UTF-8", "Windows-1252")
чтобы обойти проблему, но кто-нибудь может сказать мне, почему наличие этих символов в конце вызывает ошибку?
Более того, после этого мой лог-файл показывает «в скобках», что тоже сбивает с толку.
Мой вопрос заключается в том, почему в конце строки стоит точка-черта, а не где-то еще (за ней следуют другие символы).
Надеюсь, мой вопрос ясен, если не смогу попытаться объяснить дальше.
Благодарю.
UTF-8, использует так называемые суррогаты, которые расширяют кодовую страницу за пределы ASCII, чтобы вместить намного больше символов.
Один символ UTF-8 может быть закодирован в один, два, три или четыре байта, в зависимости от символа.
Вы обрезаете строку прямо посередине многобайтового символа:
[<-character->]
[byte-0|byte-1]
^
You cut the string right here in the middle![<-----character---->]
[byte-0|byte-1|byte-2]
^ ^
Or anywhere here if it's 3 bytes long.
Таким образом, декодер имеет первый байт (ы), но не может прочитать весь символ, потому что строка заканчивается преждевременно.
Это вызывает все эффекты, которые вы наблюдаете.
Решение этой проблемы здесь, в ответе Деззы.
Ответ Пида дает объяснение, почему это происходит, этот ответ просто смотрит на то, что вы можете с этим поделать …
многобайтовая строка Модуль был разработан именно для этой ситуации и предоставляет ряд строковых функций, которые корректно обрабатывают многобайтовые символы. Я предлагаю посмотреть там, так как, вероятно, есть другие, которые вам понадобятся в других местах вашего приложения.
Вам может потребоваться установить или включить этот модуль, если вы получаете сообщение об ошибке «функция не найдена». Инструкции для этого зависят от платформы и выходят за рамки этого вопроса.
Функция, которую вы хотите для случая в вашем вопросе называется mb_substr()
и называется так же, как вы использовали бы substr()
, но имеет другие необязательные аргументы.