У меня есть вариант использования, когда клиенту необходимо загрузить объекты, сериализованные в формате JSON, через импорт CSV. Некоторые из этих объектов содержат строки, содержащие двойные кавычки. Обычно я просто добавляю '\' перед вложенными двойными кавычками, чтобы избежать их, однако это, похоже, противоречит синтаксическому анализу файла CSV. Мы используем PHP 7.0 и функцию «fgetcsv» для чтения строк файла. Каждый раз, когда я это делаю, я замечаю странное поведение после того, как встречается экранированная двойная кавычка. Вот пример строки из CSV:
"{""test"": ""\""this\"" is a test""}"
А вот как PHP читает этот столбец с помощью fgetcsv:
{"test": "\"this\"" is a test""}"
Я подтвердил наличие двойных кавычек после того, как начальная экранированная двойная кавычка столкнулась с этой проблемой. Думая, что обратная косая черта может вызывать проблемы с экранированием, я попытался использовать другую обратную косую черту, чтобы избежать обратной косой черты:
"{""test"": ""\\""this\\"" is a test""}"
И вот результат:
{"test": "\\"this\\" is a test"}
Таким образом, хотя это действительно решает проблему с любыми двойными кавычками за пределами первой, у меня остается две обратные косые черты вместо одной.
Есть ли способ избежать этих данных, не изменяя базовый код, чтобы fgetcsv правильно их интерпретировал? Вот так:
{"test": "\"this\" is a test"}
@NathanHinchey Я не могу придумать другого варианта использования, так что мы можем ограничить область действия fgetcsv.
Вы можете уточнить, какой желаемый результат? Это {"test": "\"this\" is a test"}? (Чтобы оцененное значение "this" в JSON было "this" is a test)
@NathanHinchey Точно. Я тоже добавил это к вопросу для ясности.
@NathanHinchey Это на самом деле в выводе, а не опечатка
Конкретно в этом выводе я имел в виду: {"test": "\"this\"" is a test""}"; " после фигурной скобки - это опечатка?
@NathanHinchey, это не опечатка. Эта двойная кавычка присутствует в выводе.
Это странно.






Вы можете попробовать использовать \" для представления двойных кавычек вместо "".
Например, "{\"test\": \"\\\"this\\\" is a test\"}"
Работает ли это, может зависеть от версии fgetcsv, которую вы используете - я не уверен.
В качестве альтернативы, если вы используете fgetcsv 5.3 или более позднюю версию, вы можете попробовать изменить параметры fgetcsv, чтобы изменить символ вложения или escape-символ, чтобы он не конфликтовал с JSON. См. Параметры в документы fgetcsv.
enclosure
The optional enclosure parameter sets the field enclosure character (one character only).
escape
The optional escape parameter sets the escape character (one character only).
Note: Usually an enclosure character is escaped inside a field by doubling it; however, the escape character can be used as an alternative. So for the default parameter values "" and \" have the same meaning. Other than allowing to escape the enclosure character the escape character has no special meaning; it isn't even meant to escape itself.
(курсив в оригинале)
Я видел параметр escape-символа в документации fgetcsv, однако в идеале решение потребовало бы изменения только самого файла CSV, а не базового кода. Это может быть невозможно, но если да, то это, безусловно, предпочтительное решение.
{\ "test \": \ "\\\" this \\\ "is a test \"} тоже не был правильно проанализирован. Он был проанализирован в точности так, как был введен: {\ "test \": \ "\\\" this \\\ "is a test \"}. Я использую PHP 7.0.
Вы заключили это в двойные кавычки? Если так, это СУПЕР странно, и я бы посоветовал регистрируя это как ошибку PHP, прикусить пулю и изменить свой код. Извините ¯ \ _ (ツ) _ / ¯
Да. Действительно, очень странно. Спасибо за рекомендации.
Вам нужно, чтобы эти CSV были прочитаны кем-либо, кроме
fgetcsv?