Probleme mit der Zeichenkodierung im WordPress-PHP-PluginPhp

PHP-Programmierer chatten hier
Guest
 Probleme mit der Zeichenkodierung im WordPress-PHP-Plugin

Post by Guest »

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:

Code: Select all

"© 2024   •   Printing & Publishing Co., Inc.   •   All Rights Reserved"
und es ist in meinem PHP-Plugin wie folgt codiert:

Code: Select all

"u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
Das scheint eine UTF-16-Kodierung ohne das führende „\“ oder „0x“ zu sein. Die von iconv_get_encoding zurückgegebene Iconv-Erweiterungskonfiguration lautet:

Code: Select all

[input_encoding] => UTF-8
[output_encoding] => UTF-8
[internal_encoding] => UTF-8
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:

Code: Select all

"u00a9 2024 u00a0 u2022 u00a0 Printing & Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
oder

Code: Select all

"u00a9 2024 u00a0 u2022 u00a0 Printing u0026 Publishing Co., Inc. u00a0 u2022 u00a0 All Rights Reserved"
abhängig davon, ob ich html_entity_decode verwendet habe oder nicht.
Mir ist aufgefallen, dass der folgende Code ein ähnliches Ergebnis liefert:

Code: Select all

$char = "©";
$result[] = "# ©";
$result[] = "# " . $char;
$result[] = "# \u00a9";
Bei der Ausgabe erhalte ich:

Code: Select all

# u00a9
# u00a9
# u00a9
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:

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');
}
Die Ausgabe bleibt bestehen:

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 habe auch versucht:

Code: Select all

$result[] = str_replace("u00a9", "©", $string);
$result[] = str_replace("\u00a9", "©", $string);
Mit den gleichen Ergebnissen:

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
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:

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);
Erzeugt Folgendes:

Code: Select all

"(c) 2024   -  Printing & Publishing Co., Inc.    -   All Rights Reserved"
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):

Code: Select all

$response = wp_remote_get($url);
$html = wp_remote_retrieve_body($response);
$regex = "/>[^>]*© [0-9]{4}[^

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post