Webservices Windows-1253 και UTF-8 encoding (Linux/Woocommerce etc. Integratations)

734 views
Skip to first unread message

dvay...@gmail.com

unread,
Sep 28, 2023, 4:33:54 AM9/28/23
to Softone Developers Network
Είναι πραγματικά δύσκολο το να παίξεις σε Linux-php με Windows 1253 encoding.

Είναι πραγματικά κρίμα να μιλάμε για Webservices (δηλαδή κυρίως για επικοινωνία με ετερογενή συστήματα) και το encoding να μη είναι UTF-8.

Επειδή κουράστηκα πολύ για να το κάνω να δουλέψει κι επειδή είδα ότι υπάρχουν συναφή ερωτήματα εδώ σας μεταφέρω την λύση.

Ας υποθέσουμε ότι χτυπάμε το webservice με αυτό:

    $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);
  
Φιλικά, 

Δημήτρης

tstyl...@gmail.com

unread,
Jan 29, 2024, 5:59:31 AM1/29/24
to Softone Developers Network

Καλημέρα σας
Θα συμφωνήσω με το UTF-8. Τα περισσότερα συτήματα υποστηρίζουν utf-8 πλέον (και πολλά, μόνον utf-8).
Παρ ' όλα αυτα, ακόμα και με php linux μπορείς να χρησιμοποιήσεις το παρακάτω, αν υποθέσουμε ότι χρησιμοποιείς curl.:
curl_setopt($ch, CURLOPT_POST      ,1);
curl_setopt($ch, CURLOPT_ENCODING ,"");        // S.O.S for oncloud
curl_setopt($ch, CURLOPT_POSTFIELDS , $postdata );
curl_setopt($ch, CURLOPT_FOLLOWLOCATION  ,1);
$Rec_Data = curl_exec($ch);
$utf8data = mb_convert_encoding( $Rec_Data, 'UTF-8', 'ISO-8859-7'); // το ISO-8859-7 είναι σχεδόν ισοδύναμο με το Windows-1253.
Εδώ και πολλά χρόνια χρησιμοποιώ αυτό το σχήμα.
Αλλά από όσο είδα, μάλλον χρησιμοποιείς function του Wordpress και όχι απευθείας την curl .
Reply all
Reply to author
Forward
0 new messages