New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dziwny problem z kodowaniem UTF-8 kluczy tablicy / krzaki #1

Closed
websafe opened this Issue Sep 12, 2018 · 8 comments

Comments

Projects
None yet
2 participants
@websafe

websafe commented Sep 12, 2018

Mam dziwny problem, po pobraniu danych klucze tablicy wyników zawierają krzaki, zamiast prawidłowych znaków UTF-8. Poniżej przykładowy kod ilustrujący problem:

<?php
require 'api/src/HRDApi.php';

use HRDBase\Api\HRDApi;

//
$apiInstance = HRDApi::getInstance([
    'apiHash' => '***',
    'apiLogin' => '***',
    'apiPass' => '***',
]);

//
header('Content-Type: text/plain; charset=UTF-8');

//
$testUTF = 'Test UTF-8: ąęźłćśóŁÓŹĆŻ';

//
echo $testUTF . PHP_EOL;

//
echo 'Wykryte kodowanie: ' . mb_detect_encoding($testUTF) . PHP_EOL;

//
$token = $apiInstance->getToken();

//
$info = $apiInstance->partnerPricingServiceInfo('d_pl');

//
print_r($info);

//
print_r(array_keys($info['prices']));

I wynik:

Test UTF-8: ąęźłćśóŁÓŹĆŻ
Wykryte kodowanie: UTF-8
Array
(
    [name] => d_pl
    [prices] => Array
        (
            [Rejestracja] => 10.00
            [Odnowienie] => 45.00
            [Transfer] => 0.00
            [Transfer wygas�ej] => 50.00
            [Cesja] => 0.00
            [Ukrywanie danych] => 0.00
            [Odnowienie wygas�ej] => 50.00
            [Odnowienie z kwarantanny] => 50.00
            [Odnowienie do dnia] => 0.25
            [Opcja na domen�] => 35.00
            [Odnowienie opcji na domen�] => 45.00
        )

)
Array
(
    [0] => Rejestracja
    [1] => Odnowienie
    [2] => Transfer
    [3] => Transfer wygas�ej
    [4] => Cesja
    [5] => Ukrywanie danych
    [6] => Odnowienie wygas�ej
    [7] => Odnowienie z kwarantanny
    [8] => Odnowienie do dnia
    [9] => Opcja na domen�
    [10] => Odnowienie opcji na domen�
)

@websafe websafe changed the title from Dziwny problem z kodowaniem UTF-8 indeksów tablicy / krzaki to Dziwny problem z kodowaniem UTF-8 kluczy tablicy / krzaki Sep 12, 2018

@dusta

This comment has been minimized.

Show comment
Hide comment
@dusta

dusta Sep 12, 2018

Contributor

Spróbuj się podłączyć pod http://api.test.hrd.pl/ czy tam też występuje bład
I zrzuć

$list = $apiInstance->partnerGetPricingsList();
var_dump($list);

a następnie

$info = $apiInstance->partnerPricingServiceInfo('d_pl');
var_dump($list);

Sprawdź też czy edytor którego używasz zapisuje w UTF-8

Contributor

dusta commented Sep 12, 2018

Spróbuj się podłączyć pod http://api.test.hrd.pl/ czy tam też występuje bład
I zrzuć

$list = $apiInstance->partnerGetPricingsList();
var_dump($list);

a następnie

$info = $apiInstance->partnerPricingServiceInfo('d_pl');
var_dump($list);

Sprawdź też czy edytor którego używasz zapisuje w UTF-8

@websafe

This comment has been minimized.

Show comment
Hide comment
@websafe

websafe Sep 12, 2018

Skorygowałem w pliku api/src/HRDApi.php protected $host = 'api.hrd.pl'; na protected $host = 'api.test.hrd.pl'; i kiedy próbuję uruchomić przykładowy skrypt (ten, który wyżej wkleiłem), dostaję:

Test UTF-8: ąęźłćśóŁÓŹĆŻ
Wykryte kodowanie: UTF-8
PHP Fatal error:  Uncaught Error: Class 'HRDBase\Api\Exceptions\HRDApiCommunicationException' not found in /var/www/htdocs/hrdklient/api/src/HRDApi.php:1892
Stack trace:
#0 /var/www/htdocs/hrdklient/api/src/HRDApi.php(2110): HRDBase\Api\HRDApi->parseError(Object(DOMXPath))
#1 /var/www/htdocs/hrdklient/api/src/HRDApi.php(2430): HRDBase\Api\HRDApi->sendArrayResponse(Object(DOMDocument), 'partner/pricing', Array, 'partner/pricing')
#2 /var/www/htdocs/hrdklient/hrd-utf-problem.php(29): HRDBase\Api\HRDApi->partnerPricingServiceInfo('d_pl')
#3 {main}
  thrown in /var/www/htdocs/hrdklient/api/src/HRDApi.php on line 1892

Jakoś inaczej mam się "podłączyć" do api.test.hrd.pl?

Plik jest zapisany w UTF-8. Żeby mieć podręczną weryfikację dodałem właśnie w tym celu do przykładowego pliku wiersze:

header('Content-Type: text/plain; charset=UTF-8');
$testUTF = 'Test UTF-8: ąęźłćśóŁÓŹĆŻ';
echo $testUTF . PHP_EOL;
echo 'Wykryte kodowanie: ' . mb_detect_encoding($testUTF) . PHP_EOL;

I to się wszystko elegancko bez krzaków pokazuje jak i zwraca Wykryte kodowanie: UTF-8.

websafe commented Sep 12, 2018

Skorygowałem w pliku api/src/HRDApi.php protected $host = 'api.hrd.pl'; na protected $host = 'api.test.hrd.pl'; i kiedy próbuję uruchomić przykładowy skrypt (ten, który wyżej wkleiłem), dostaję:

Test UTF-8: ąęźłćśóŁÓŹĆŻ
Wykryte kodowanie: UTF-8
PHP Fatal error:  Uncaught Error: Class 'HRDBase\Api\Exceptions\HRDApiCommunicationException' not found in /var/www/htdocs/hrdklient/api/src/HRDApi.php:1892
Stack trace:
#0 /var/www/htdocs/hrdklient/api/src/HRDApi.php(2110): HRDBase\Api\HRDApi->parseError(Object(DOMXPath))
#1 /var/www/htdocs/hrdklient/api/src/HRDApi.php(2430): HRDBase\Api\HRDApi->sendArrayResponse(Object(DOMDocument), 'partner/pricing', Array, 'partner/pricing')
#2 /var/www/htdocs/hrdklient/hrd-utf-problem.php(29): HRDBase\Api\HRDApi->partnerPricingServiceInfo('d_pl')
#3 {main}
  thrown in /var/www/htdocs/hrdklient/api/src/HRDApi.php on line 1892

Jakoś inaczej mam się "podłączyć" do api.test.hrd.pl?

Plik jest zapisany w UTF-8. Żeby mieć podręczną weryfikację dodałem właśnie w tym celu do przykładowego pliku wiersze:

header('Content-Type: text/plain; charset=UTF-8');
$testUTF = 'Test UTF-8: ąęźłćśóŁÓŹĆŻ';
echo $testUTF . PHP_EOL;
echo 'Wykryte kodowanie: ' . mb_detect_encoding($testUTF) . PHP_EOL;

I to się wszystko elegancko bez krzaków pokazuje jak i zwraca Wykryte kodowanie: UTF-8.

@dusta

This comment has been minimized.

Show comment
Hide comment
@dusta

dusta Sep 12, 2018

Contributor

@websafe consultingservice zaktualizował i udostępnił oficjalne repozytorium dostępne jest ono pod adresem
https://gitlab.com/consultingservice/hrd-api/tree/master

ps. niestety widzę ten sam bład

array(2) {
  ["name"]=>
  string(4) "d_pl"
  ["prices"]=>
  array(11) {
    ["Rejestracja"]=>
    string(5) "10.00"
    ["Odnowienie"]=>
    string(5) "46.00"
    ["Transfer"]=>
    string(4) "0.00"
    ["Transfer wygas�ej"]=>
    string(5) "51.00"
    ["Cesja"]=>
    string(4) "0.00"
    ["Ukrywanie danych"]=>
    string(4) "0.00"
    ["Odnowienie wygas�ej"]=>
    string(5) "51.00"
    ["Odnowienie z kwarantanny"]=>
    string(5) "51.00"
    ["Odnowienie do dnia"]=>
    string(4) "0.25"
    ["Opcja na domen�"]=>
    string(5) "35.00"
    ["Odnowienie opcji na domen�"]=>
    string(5) "45.00"
  }
}

Zresztą KEY nie powinien zawierać takich znaków

Jeśli natomiast chodzi o bład z "Uncaught Error" musisz załadować wszystkie pliki z folderu src/Exceptions

Contributor

dusta commented Sep 12, 2018

@websafe consultingservice zaktualizował i udostępnił oficjalne repozytorium dostępne jest ono pod adresem
https://gitlab.com/consultingservice/hrd-api/tree/master

ps. niestety widzę ten sam bład

array(2) {
  ["name"]=>
  string(4) "d_pl"
  ["prices"]=>
  array(11) {
    ["Rejestracja"]=>
    string(5) "10.00"
    ["Odnowienie"]=>
    string(5) "46.00"
    ["Transfer"]=>
    string(4) "0.00"
    ["Transfer wygas�ej"]=>
    string(5) "51.00"
    ["Cesja"]=>
    string(4) "0.00"
    ["Ukrywanie danych"]=>
    string(4) "0.00"
    ["Odnowienie wygas�ej"]=>
    string(5) "51.00"
    ["Odnowienie z kwarantanny"]=>
    string(5) "51.00"
    ["Odnowienie do dnia"]=>
    string(4) "0.25"
    ["Opcja na domen�"]=>
    string(5) "35.00"
    ["Odnowienie opcji na domen�"]=>
    string(5) "45.00"
  }
}

Zresztą KEY nie powinien zawierać takich znaków

Jeśli natomiast chodzi o bład z "Uncaught Error" musisz załadować wszystkie pliki z folderu src/Exceptions

@dusta

This comment has been minimized.

Show comment
Hide comment
@dusta

dusta Sep 12, 2018

Contributor

@websafe

Mam nadzie ze pomogłem
ddbc01b


// Example Fix utf8 keys
$partnerPricingServiceInfo = $apiInstance->partnerPricingServiceInfo('d_pl');
$info = [];
foreach ($partnerPricingServiceInfo['prices'] as $key => $value) {
    $info[] = [
        'name' => utf8_decode($key),
        'value' => $value,
    ];
}
echo '<pre>';
var_dump($info);

array(11) {
  [0]=>
  array(2) {
    ["name"]=>
    string(11) "Rejestracja"
    ["value"]=>
    string(5) "10.00"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(10) "Odnowienie"
    ["value"]=>
    string(5) "46.00"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(8) "Transfer"
    ["value"]=>
    string(4) "0.00"
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(18) "Transfer wygasłej"
    ["value"]=>
    string(5) "51.00"
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(5) "Cesja"
    ["value"]=>
    string(4) "0.00"
  }
  [5]=>
  array(2) {
    ["name"]=>
    string(16) "Ukrywanie danych"
    ["value"]=>
    string(4) "0.00"
  }
  [6]=>
  array(2) {
    ["name"]=>
    string(20) "Odnowienie wygasłej"
    ["value"]=>
    string(5) "51.00"
  }
  [7]=>
  array(2) {
    ["name"]=>
    string(24) "Odnowienie z kwarantanny"
    ["value"]=>
    string(5) "51.00"
  }
  [8]=>
  array(2) {
    ["name"]=>
    string(18) "Odnowienie do dnia"
    ["value"]=>
    string(4) "0.25"
  }
  [9]=>
  array(2) {
    ["name"]=>
    string(16) "Opcja na domenę"
    ["value"]=>
    string(5) "35.00"
  }
  [10]=>
  array(2) {
    ["name"]=>
    string(27) "Odnowienie opcji na domenę"
    ["value"]=>
    string(5) "45.00"
  }
}

Contributor

dusta commented Sep 12, 2018

@websafe

Mam nadzie ze pomogłem
ddbc01b


// Example Fix utf8 keys
$partnerPricingServiceInfo = $apiInstance->partnerPricingServiceInfo('d_pl');
$info = [];
foreach ($partnerPricingServiceInfo['prices'] as $key => $value) {
    $info[] = [
        'name' => utf8_decode($key),
        'value' => $value,
    ];
}
echo '<pre>';
var_dump($info);

array(11) {
  [0]=>
  array(2) {
    ["name"]=>
    string(11) "Rejestracja"
    ["value"]=>
    string(5) "10.00"
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(10) "Odnowienie"
    ["value"]=>
    string(5) "46.00"
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(8) "Transfer"
    ["value"]=>
    string(4) "0.00"
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(18) "Transfer wygasłej"
    ["value"]=>
    string(5) "51.00"
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(5) "Cesja"
    ["value"]=>
    string(4) "0.00"
  }
  [5]=>
  array(2) {
    ["name"]=>
    string(16) "Ukrywanie danych"
    ["value"]=>
    string(4) "0.00"
  }
  [6]=>
  array(2) {
    ["name"]=>
    string(20) "Odnowienie wygasłej"
    ["value"]=>
    string(5) "51.00"
  }
  [7]=>
  array(2) {
    ["name"]=>
    string(24) "Odnowienie z kwarantanny"
    ["value"]=>
    string(5) "51.00"
  }
  [8]=>
  array(2) {
    ["name"]=>
    string(18) "Odnowienie do dnia"
    ["value"]=>
    string(4) "0.25"
  }
  [9]=>
  array(2) {
    ["name"]=>
    string(16) "Opcja na domenę"
    ["value"]=>
    string(5) "35.00"
  }
  [10]=>
  array(2) {
    ["name"]=>
    string(27) "Odnowienie opcji na domenę"
    ["value"]=>
    string(5) "45.00"
  }
}

@websafe

This comment has been minimized.

Show comment
Hide comment
@websafe

websafe Sep 12, 2018

@dusta OK, dziękuję, czyli będzie trzeba wszystkie klucze tablic naprawiać dekodując. Rozumiem, że wszelkie kolejne zgłoszenia puszczamy już na https://gitlab.com/consultingservice/hrd-api/issues
Będzie może jakiś fix do tego problemu w oficjalnej bibliotece, czy może mam ten problem poruszyć w repo na GitLabie?

websafe commented Sep 12, 2018

@dusta OK, dziękuję, czyli będzie trzeba wszystkie klucze tablic naprawiać dekodując. Rozumiem, że wszelkie kolejne zgłoszenia puszczamy już na https://gitlab.com/consultingservice/hrd-api/issues
Będzie może jakiś fix do tego problemu w oficjalnej bibliotece, czy może mam ten problem poruszyć w repo na GitLabie?

@dusta

This comment has been minimized.

Show comment
Hide comment
@dusta

dusta Sep 12, 2018

Contributor

@websafe Współpracuje z consultingservice od kilku lat i w ostatnim czasie nie ma na co liczyć z ich strony po migracji. Jeśli będzie potrzeba zawsze służę pomocą i aktualizacją repozytorium a ewentualne błędy polecam zgłaszać tu i tu.

Contributor

dusta commented Sep 12, 2018

@websafe Współpracuje z consultingservice od kilku lat i w ostatnim czasie nie ma na co liczyć z ich strony po migracji. Jeśli będzie potrzeba zawsze służę pomocą i aktualizacją repozytorium a ewentualne błędy polecam zgłaszać tu i tu.

@websafe

This comment has been minimized.

Show comment
Hide comment
@websafe

websafe Sep 12, 2018

OK, dzięki serdeczne!

websafe commented Sep 12, 2018

OK, dzięki serdeczne!

@dusta

This comment has been minimized.

Show comment
Hide comment
@dusta

dusta Sep 12, 2018

Contributor

@websafe Repozytorium jest zaktualizowane do najnowszej wersji z hrd.

https://github.com/HRD/apiv2
https://github.com/HRD/apiv2/releases

Contributor

dusta commented Sep 12, 2018

@websafe Repozytorium jest zaktualizowane do najnowszej wersji z hrd.

https://github.com/HRD/apiv2
https://github.com/HRD/apiv2/releases

@dusta dusta closed this Sep 12, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment