Είναι πραγματικά κρίμα να μιλάμε για Webservices (δηλαδή κυρίως για επικοινωνία με ετερογενή συστήματα) και το encoding να μη είναι UTF-8.
Επειδή κουράστηκα πολύ για να το κάνω να δουλέψει κι επειδή είδα ότι υπάρχουν συναφή ερωτήματα εδώ σας μεταφέρω την λύση.
$endpoint = get_option('s1erp_account_endpoint');
$body = array(
"service" => 'SqlData',
"clientID" => get_option('s1erp_config_clientID_auth_token'), // Assuming this is the correct clientID.
"appId" => get_option('s1erp_config_appid'),
"SqlName" => "ffCusLoyalty",
"company" => get_option('s1erp_config_companyid')
);
// Send the POST request
$response = wp_remote_post($endpoint, array(
'body' => json_encode($body, JSON_UNESCAPED_UNICODE),
'timeout' => 15,
));
if (is_wp_error($response)) {
error_log("Error Loading Data ");
} else {
$response_data = wp_remote_retrieve_body($response);
if ($response_data) {
$detected_encoding = mb_detect_encoding($response_data, array('UTF-8', 'ISO-8859-7', 'ISO-8859-1', 'Windows-1252'), true);
if ($detected_encoding && $detected_encoding !== 'UTF-8') {
// $response_data = mb_convert_encoding($response_data, 'UTF-8', $detected_encoding);
$response_data = iconv("Windows-1253", "UTF-8", $response_data);
}
error_log("Detected Encoding: " . $detected_encoding);
error_log("Sample Data: " . substr($response_data, 0, 100));
Σε προηγούμενο Post παρατήρησα ότι είχε γίνει αναφορά στο mb_convert_encoding.
Δυστυχώς αυτή δεν είναι καθαρή λύση. Είχα καταφέρει να μου παίξει, μετά έγινε μια αλλαγή στο feed (ακόμη μαλώνω με τον Soft1 consultant για το ότι κάτι πείραξε αυτός και χάλασε μετά από μια αλλαγή που έγινε κι ακόμη άκρη δεν έχουμε βρει :) ).
Το mb_convert_encoding δυστυχώς δεν υποστηρίζει Windows-1253.
Αν το βάλετε εδώ
$detected_encoding = mb_detect_encoding($response_data, array('UTF-8', 'ISO-8859-7', 'ISO-8859-1', 'Windows-1252'), true);
στη θέση του 1252, θα σας σκάσει. Αυτό που κάνει, διαβάζοντας το feed από το SOFT1 είναι να γίνει αναγωγή σε Windows-1252 που τελικά οδηγεί σε λάθη.
Μετά από πολύ... πόνο η καθαρή λύση είναι αυτή:
$response_data = iconv("Windows-1253", "UTF-8", $response_data);
Φιλικά,
Δημήτρης