2016-11-01 2 views
0

Ich arbeite an einem Skript, mit dem ich ein kleines Problem habe.array_map verursacht Probleme mit erweitertem ASCII für chr() (PHP)

Das Skript erwartet, dass Zeichenfolgen in Bytedaten an es übergeben werden. Als Beispiel habe ich die Zeichenfolge:

61,68,71,61,68,101,118,105,101,116,104

die = DG = Devieth erweist. Der folgende Code nimmt diese Zeile und übersetzt sie erfolgreich:

$sv_reportee = implode(array_map('chr', explode(',', $_GET['defendant']))); 

Nun lassen Sie uns sagen, dass ich diese Zeichenfolge ändern 171 («) enthalten und 187 (»). Das Skript spuckt keine Warnungen aus, keine Notizen oder irgendetwas ... es weigert sich einfach, mehr Arbeit in Bezug auf das Arbeiten mit Variablen zu leisten. Es führt die anderen Funktionen durch genau, aber das Ausführen von print ($ sv_reportee) führt dazu, dass überhaupt nichts für diese Variable kommt.

Dies war meine Referenz für die obige Codezeile: PHP Get String Text From Bytes

nun von dem, was ich verstehe, sollte chr() in der Lage sein, 0-255 auf der ASCII-Tabelle zu behandeln. Recht? Oder gibt es einen anderen Weg, wie ich das tun könnte/könnte, der die obige Codezeile nicht beinhaltet?

Erwähnenswert, wegen einer Einschränkung in einem anderen Aspekt der Anwendung muss die Zeichenfolge in Byteform gesendet werden. Es gibt leider keine andere Möglichkeit - wir haben alle anderen möglichen Optionen ausgeschöpft.

+0

Hallo, ASCII ist 0-128 alles mehr braucht Codierung ich glaube. Es gibt etwas wie "erweitertes ASCII" [hier] (http://www.theasciicode.com.ar/extended-ascii-code/one-half-ascii-code-171.html), aber die Ints passen nicht mit deins (171 == 1/2 statt Zitat). Jetzt entspricht Ihr Beispiel latin1 - https://en.wikipedia.org/wiki/ISO/IEC_8859-1. also würde ich versuchen, [this] (http://stackoverflow.com/a/16165685/3727050) UTF8 neu zu codieren ... – urban

+0

@urban Danke für den Link - der die Zeichenkette mit utf8_encode() umgab, sowie den Header-Typ festlegen. – mywarthog

Antwort

1

Was chr macht es eine ganze Zahl zu einem rohen Byte zu übersetzen, was bedeutet:

chr(171) 
→ "\xAB" 
= 1010 1011 

Das ist alles. 171 ist nicht gleich dem Zeichen "«. Alles gleich ist das Byte 0xAB. Wie das in Zeichen übersetzt wird, ist eine andere Geschichte und hängt davon ab, für welche Kodierung dieses Byte interpretiert wird. 0xAB passiert gleich "" in der ISO-8859-1-Codierung. Vorausgesetzt, dass Sie diese im Browser sind testen, dies würde Ausgang „« ":

header('Content-Type: text/html; charset=iso-8859-1'); 
echo chr(171); 

Hier sind Sie den Browser explizit erklärt, welche Codierung der Daten als zu interpretieren. Wenn "nichts" angezeigt wird, verwendet wahrscheinlich alles, was die Bytes als Zeichen interpretiert, eine Codierung, bei der 0xAB nichts bedeutet. Wenn Sie nicht wollen, ISO-8859-1 verwenden (diese Tage und in der Regel sollten Sie nicht), müssen Sie die Daten in einer anderen Codierung konvertieren:

header('Content-Type: text/html; charset=utf-8'); 
echo iconv('ISO-8859-1', 'UTF-8', chr(171)); 
+0

Ja, perfekt. Der Header() und die Umgebung mit utf8_encode() haben den Trick perfekt gemacht. Vielen Dank! – mywarthog