Escape-Zeichen entkommen

8

Ich versuche, die in PHP 5.3.0 implementierten json_encode Bitmask-Flags nachzuahmen, hier ist der String, den ich habe:

%Vor%

Doing json_encode($s, JSON_HEX_APOS | JSON_HEX_QUOT) gibt Folgendes aus:

%Vor%

Und das mache ich gerade in PHP-Versionen älter als 5.3.0:

%Vor%

Welches korrekt das gleiche Ergebnis ausgibt:

%Vor%

Ich habe Probleme, zu verstehen. Warum muss ich einfache Anführungszeichen ( '\\'' oder sogar "\'" [ umgebende Zitate ausgeschlossen ]) durch '\\u0027' und nicht nur% ersetzen? co_de% .

Hier ist der Code, der Probleme bei der Portierung auf PHP & lt; 5.3:

%Vor%     
Alix Axel 20.05.2010, 03:41
quelle

6 Antworten

13

Die PHP-Zeichenfolge

%Vor%

ist nur PHPs Weg, den literalen Wert zu erhalten

%Vor%

in eine Zeichenfolge, die verwendet werden kann. Durch den Aufruf von addslashes für diese Zeichenfolge werden die folgenden 11 Zeichen

%Vor%

d. strlen(addslashes('O\'Rei"lly')) == 11

Dies ist der Wert, der an json_escape gesendet wird.

In JSON ist der umgekehrte Schrägstrich ein Escape-Zeichen, so dass es maskiert werden muss, d. h.

\ ist \

Auch einfache und doppelte Anführungszeichen können Probleme verursachen. Sie werden also in einer Weise in ihre Unicode-Äquivalente konvertiert, um Probleme zu vermeiden. Also später versionen von PHP's json_encode ändern

' ist \u0027

und

" ist \u0022

Also diese drei Regeln auf

anwenden %Vor%

gibt uns

%Vor%

Diese Zeichenfolge wird dann in doppelte Anführungszeichen eingeschlossen, um sie zu einer JSON-Zeichenfolge zu machen. Ihre Ersetzungsausdrücke enthalten die führenden Schrägstriche. Entweder aus Versehen oder absichtlich bedeutet dies, dass das von json_encode zurückgegebene führende und nachfolgende doppelte Anführungszeichen nicht der Umgehung unterliegt, was nicht sein sollte.

So in früheren Versionen von PHP

%Vor%

würde drucken

%Vor%

und wir möchten ' ändern in \u0027 und wir wollen \" in \u0022 ändern, weil \ in \" nur dazu dient, die " in die Zeichenkette zu bekommen, weil sie mit doppelten Anführungszeichen beginnt und endet.

Darum bekommen wir

%Vor%     
awatts 26.05.2010, 22:51
quelle
2

Es entzieht sich sowohl dem Backslash als auch dem Zitat. Es ist schwierig, mit entflohenen Fluchten umzugehen, wie Sie es hier tun, da es sich schnell in Backslash-Zählspiele verwandelt. : - /

    
staticsan 20.05.2010 04:01
quelle
2

Wenn ich richtig verstehe, möchten Sie nur wissen, warum Sie

verwenden müssen

'\\u0027' und nicht nur '\u0027'

Sie entkommen dem Schrägstrich und dem Unicode-Zeichenwert. Damit sagen Sie json, dass es dort einen Apostroph geben sollte, aber es benötigt den Backslash und die u, um zu wissen, dass ein hexadezimaler Unicode-Zeichencode als nächstes kommt.

Da Sie diese Zeichenfolge umgehen:

%Vor%

Der erste umgekehrte Schrägstrich entkommt tatsächlich dem Backslash vor dem Apostroph. Dann wird der nächste Schrägstrich verwendet, um den Backslash zu umgehen, der von json verwendet wird, um das Zeichen als Unicode-Zeichen zu identifizieren.

Wenn Sie O'Reilly statt O \ 'Rei \' den Algorithmus anwenden würden, dann würde letzterer genügen.

Ich hoffe, Sie finden das nützlich. Ich überlasse Ihnen nur diesen Link, so dass Sie mehr darüber lesen können, wie json aufgebaut ist, da es offensichtlich ist, dass Sie PHP bereits verstehen:

Ссылка

    
dabito 26.05.2010 21:08
quelle
2

Wenn Sie eine Zeichenfolge für json codieren, müssen einige Dinge ungeachtet der Optionen maskiert werden. Wie andere darauf hingewiesen haben, enthält das "\", so dass jeder Backslash-Lauf durch json_encode verdoppelt wird. Da Sie Ihre Zeichenfolge zuerst über addslashes ausführen, die auch Anführungszeichen Backslashes hinzufügen, fügen Sie viele zusätzliche Backslashes hinzu. Die folgende Funktion emuliert, wie json_encode eine Zeichenfolge codiert. Wenn der Zeichenfolge bereits Backslashes hinzugefügt wurden, werden sie verdoppelt.

%Vor%     
drawnonward 27.05.2010 18:11
quelle
1

Da du zu json_encode die Zeichenkette \' gehst, musst du zuerst die \ und dann die ' kodieren. Sie haben also \ und \u0027 . Verkettung dieser Ergebnisse \\u0027 .

    
Zsolti 20.05.2010 06:45
quelle
0

Die von \ generierten addslashes() werden um json_encode() zurückgemeldet. Du wolltest wahrscheinlich sagen Doing json_encode($s, JSON_HEX_APOS | JSON_HEX_QUOT) outputs the following , aber du hast $str anstelle von $s benutzt, was jeden verwirrt hat.

Wenn Sie die Zeichenfolge "O\\u0027Rei\\u0022lly" in JavaScript auswerten, erhalten Sie "O\'rei\"lly" und ich bin mir ziemlich sicher, dass nicht das ist, was Sie wollen. Wenn Sie es auswerten, müssen Sie wahrscheinlich alle Steuercodes entfernt haben. Mach weiter, stecke das in eine Datei: alert("O\\u0027Rei\\u0022lly") .

Fazit: Sie entgehen den Anführungszeichen zweimal, was wahrscheinlich nicht das ist, was Sie brauchen. json_encode entzieht bereits alles, was benötigt wird, damit jeder JavaScript-Parser die ursprüngliche Datenstruktur zurückgibt. In Ihrem Fall ist das die Zeichenfolge, die Sie nach dem Aufruf von addslashes erhalten haben.

Beweis:

%Vor%     
Tom 23.05.2010 18:19
quelle

Tags und Links