Probleme mit der Zeichenkodierung im WordPress-PHP-Plugin
Posted: 13 Jan 2025, 12:16
Es stellte sich heraus, dass dieses Problem kein Problem mit meinem PHP-WP-Plugin-Code war, sondern vielmehr ein Problem damit, wie ich den vom Plugin zurückgegebenen JSON verarbeitet habe. Kurze Antwort: Verwenden Sie einfach das jq jq 1.7-Handbuch, aber ich habe den Hauptteil meines Schreibens unten zur Information gelassen.
Ich versuche, ein WordPress-Plugin zu schreiben, um eine Copyright-Zeichenfolge für eine bestimmte Website zu extrahieren URL. Die in der HTML-Seite der angegebenen Website enthaltene Zeichenfolge lautet:
und es ist in meinem PHP-Plugin wie folgt codiert:
Das scheint eine UTF-16-Kodierung ohne das führende „\“ oder „0x“ zu sein. Die von iconv_get_encoding zurückgegebene Iconv-Erweiterungskonfiguration lautet:
Der HTML-Code der Website deklariert den Zeichensatz als charset="UTF-8".
Ich habe alle möglichen Variationen von html_entity_decode ausprobiert , mb_convert_encoding und sogar die Suche nach regulären Ausdrücken für „'/u([0-9a-fA-F]{4})/'“, um diese scheinbar UTF-16-codierten Zeichen abzufangen, alles ohne Erfolg. Ich bekomme immer:
oder
abhängig davon, ob ich html_entity_decode verwendet habe oder nicht.
Mir ist aufgefallen, dass der folgende Code ein ähnliches Ergebnis liefert:
Bei der Ausgabe erhalte ich:
Ich habe festgestellt, dass es drei verschiedene Möglichkeiten gibt, das gleiche Ergebnis zu erzielen.
Hier ist, wie ich versucht habe, preg_replace_callback zu verwenden, um dieses Problem zu beheben:
Die Ausgabe bleibt bestehen:
Ich habe auch versucht:
Mit den gleichen Ergebnissen:
Jeder Einblick in den Umgang mit diesen Zeichenkodierungen wäre sehr dankbar. Ich schätze, meine zugrunde liegende Frage ist, wenn die interne_Kodierung UTF-8 ist, warum bestehen diese Codepunkte dann aus 4 statt 2 Zeichen?
Ich fand einen wirklich umständlichen Ansatz, definitiv nicht meine bevorzugte Lösung:
Erzeugt Folgendes:
Ich würde auf jeden Fall gerne eine elegantere Lösung finden.
Die Kodierung und Dekodierung des Strings erfolgt als Ergebnis des folgenden Codes (normalerweise es gibt nur eine Übereinstimmung):
Ich versuche, ein WordPress-Plugin zu schreiben, um eine Copyright-Zeichenfolge für eine bestimmte Website zu extrahieren URL. Die in der HTML-Seite der angegebenen Website enthaltene Zeichenfolge lautet:
Code: Select all
"© 2024 • Printing & Publishing Co., Inc. • All Rights Reserved"
Code: Select all
"u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
Code: Select all
[input_encoding] => UTF-8
[output_encoding] => UTF-8
[internal_encoding] => UTF-8
Ich habe alle möglichen Variationen von html_entity_decode ausprobiert , mb_convert_encoding und sogar die Suche nach regulären Ausdrücken für „'/u([0-9a-fA-F]{4})/'“, um diese scheinbar UTF-16-codierten Zeichen abzufangen, alles ohne Erfolg. Ich bekomme immer:
Code: Select all
"u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
Code: Select all
"u00a9 2024 u00a0 u2022 u00a0 Printing u0026 Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
Mir ist aufgefallen, dass der folgende Code ein ähnliches Ergebnis liefert:
Code: Select all
$char = "©";
$result[] = "# ©";
$result[] = "# " . $char;
$result[] = "# \u00a9";
Code: Select all
# u00a9
# u00a9
# u00a9
Hier ist, wie ich versucht habe, preg_replace_callback zu verwenden, um dieses Problem zu beheben:
Code: Select all
$string = "© 2024 • Printing & Publishing Co., Inc. • All Rights Reserved";
$result[] = $string;
$result[] = preg_replace_callback('/u([0-9a-fA-F]{4})/', 'unicodeToUtf8', $string);
function unicodeToUtf8($matches) {
$codepoint = hexdec($matches[1]);
return mb_convert_encoding("&#{$codepoint};", 'UTF-8', 'HTML-ENTITIES');
}
Code: Select all
[0] => u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved
[1] => u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved
Code: Select all
$result[] = str_replace("u00a9", "©", $string);
$result[] = str_replace("\u00a9", "©", $string);
Code: Select all
[0] => u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved
[1] => u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved
Ich fand einen wirklich umständlichen Ansatz, definitiv nicht meine bevorzugte Lösung:
Code: Select all
$string = "© 2024 • Printing & Publishing Co., Inc. • All Rights Reserved";
$result = html_entity_decode($string);
$result = str_replace('©', '(c)', $result);
$result = str_replace('•', '-', $result);
$result = str_replace('–', '-', $result);
$result = str_replace('&', '&', $result);
$result = str_replace('®', '(r)', $result);
Code: Select all
"(c) 2024 - Printing & Publishing Co., Inc. - All Rights Reserved"
Die Kodierung und Dekodierung des Strings erfolgt als Ergebnis des folgenden Codes (normalerweise es gibt nur eine Übereinstimmung):
Code: Select all
$response = wp_remote_get($url);
$html = wp_remote_retrieve_body($response);
$regex = "/>[^>]*© [0-9]{4}[^