Diese Frage sieht peinlich einfach aus, aber ich konnte keine Antwort finden.
Was entspricht PHP der folgenden C # -Codezeile?
string str = "\u1000";
In diesem Beispiel wird eine Zeichenfolge mit einem einzelnen Unicode-Zeichen erstellt, dessen "numerischer Unicode-Wert" 1000 hexadezimal (4096 dezimal) beträgt.
Wie kann ich in PHP eine Zeichenfolge mit einem einzelnen Unicode-Zeichen erstellen, dessen "numerischer Unicode-Wert" bekannt ist?
Antworten:
Da JSON die
\uxxxx
Syntax direkt unterstützt , fällt mir als Erstes Folgendes ein:Eine andere Option wäre zu verwenden
mb_convert_encoding()
oder nutzen Sie die direkte Zuordnung zwischen UTF-16BE (Big Endian) und dem Unicode-Codepunkt:
quelle
\uxxxx
Unicode-Syntax, sodass Siejson_decode
an einer künstlich erstellten JSON-Zeichenfolgendarstellung arbeiten können. Ich habe den Wortlaut geändert, um dies zu klären.echo json_decode('\u201B');
was sich auf ein einzelnes rückgängig gemachtes Zitat bezieht. Es funktioniert jedoch nicht, was bedeutet, dass keine Ausgabe erfolgt (auch wenn es an einehd
echo json_decode('"\u201B"');
. Doppelte Anführungszeichen um das Unicode-Symbol sind obligatorisch.PHP 7.0.0 hat die Syntax "Unicode Codepoint Escape" eingeführt .
Es ist jetzt möglich, Unicode-Zeichen einfach mit einem doppelten oder einem Heredoc- String zu schreiben , ohne eine Funktion aufzurufen.
quelle
wordwrap($longLongText, 20, "\u{200B}", true);
Ich frage mich, warum dies noch niemand erwähnt hat, aber Sie können eine fast gleichwertige Version mit Escape-Sequenzen in doppelten Anführungszeichen erstellen :
ASCII-Beispiel:
Für Ihren Fall müssen Sie also nur noch etwas tun
$str = "\x30\xA2";
. Dies sind jedoch Bytes , keine Zeichen. Die Bytedarstellung des Unicode-Codepunkts stimmt mit dem UTF-16-Big-Endian überein, sodass wir ihn direkt als solchen ausdrucken können:Wenn Sie eine andere Codierung verwenden, müssen Sie die Bytes entsprechend ändern (meistens mit einer Bibliothek, aber auch von Hand möglich).
UTF-16 Little Endian Beispiel:
UTF-8-Beispiel:
Es gibt auch die
pack
Funktion, aber Sie können erwarten, dass sie langsam ist.quelle
PHP kennt diese Unicode-Escape-Sequenzen nicht. Da unbekannte Escape-Sequenzen jedoch nicht betroffen sind, können Sie eine eigene Funktion schreiben, die solche Unicode-Escape-Sequenzen konvertiert:
Oder mit einem anonymen Funktionsausdruck anstelle von
create_function
:Seine Verwendung:
quelle
Das funktioniert auch. Die json_decode () -Lösung ist jedoch viel schneller (ungefähr 50-mal).
quelle
Probieren Sie Portable UTF-8 aus :
Alle arbeiten genauso. Sie können den Codepunkt eines Zeichens mit abrufen
utf8_ord()
. Lesen Sie mehr über Portable UTF-8 .quelle
Wie von anderen erwähnt, führt PHP 7 die
\u
direkte Unterstützung der Unicode-Syntax ein.Wie auch von anderen erwähnt, besteht die einzige Möglichkeit, einen Zeichenfolgenwert aus einer sinnvollen Unicode-Zeichenbeschreibung in PHP zu erhalten, darin, ihn von etwas anderem zu konvertieren (z. B. JSON-Analyse, HTML-Analyse oder einer anderen Form). Dies ist jedoch mit Leistungskosten zur Laufzeit verbunden.
Es gibt jedoch noch eine andere Option. Sie können das Zeichen direkt in PHP mit
\x
binärem Escapezeichen codieren . Die\x
Escape-Syntax wird auch in PHP 5 unterstützt .Dies ist besonders nützlich, wenn Sie das Zeichen aufgrund seiner natürlichen Form nicht direkt in eine Zeichenfolge eingeben möchten. Zum Beispiel, wenn es sich um ein unsichtbares Steuerzeichen oder ein anderes schwer zu erkennendes Leerzeichen handelt.
Zunächst ein Beweisbeispiel:
Beachten Sie, dass dieser Binärcode, wie von Pacerier in einer anderen Antwort erwähnt, für eine bestimmte Zeichenkodierung eindeutig ist. Im obigen Beispiel
\xE2\x80\x8A
ist die Binärcodierung für U + 200A in UTF-8.Die nächste Frage ist, wie kommst du von
U+200A
zu\xE2\x80\x8A
?Unten finden Sie ein PHP-Skript zum Generieren der Escape-Sequenz für ein beliebiges Zeichen, basierend auf einer JSON-Zeichenfolge, einer HTML-Entität oder einer anderen Methode, sobald Sie diese als native Zeichenfolge haben.
quelle
$ msg = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';
echo unicode_to_textstring ($ str);
quelle