Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Generowanie pliku XML i wieczny problem z Polskimi znakami.
Forum PHP.pl > Forum > PHP
luis2luis
Wiecznie mam problem z Polskimi znakami.
Radze sobie jakoś z tym, ale nie rozumie wcale zagadnienia.

Leciwy już iconv() nigdy nie udało mi się poprawnie uruchomić smile.gif
Jest jeszcze utf8_encode() i utf8_decode() też nie wiem po co to jest w sumie jak jest iconv() ktory powinien takie sprawy załatwić smile.gif
Dane z bazy pobierane są poprawnie w formacie UTF-8.

  1. $result_xml = utf8_encode($result_xml);
  2.  
  3. $dom = new DOMDocument('1.0', 'UTF-8');
  4. $dom->preserveWhiteSpace = FALSE;
  5. //$dom->loadXML(utf8_encode(clearExport($result_xml))); //probowalem tez tak
  6. $dom->loadXML(clearExport($result_xml));
  7. $dom->save('xml/brandbank_.xml');//'.date("YmdHis").'
  8.  
  9. //kasuje z xmla znaki które kolidują, szkoda, że metoda save nie dba o to :)
  10. function clearExport($value) {
  11. //$value = str_replace(';', ',', $value);
  12. $value = str_replace('\"', "'", $value);
  13. //$value = str_replace('"', "'", $value);
  14. $value = str_replace('*', "", $value);
  15. $value = str_replace('&', "", $value);
  16.  
  17. //$liczba = preg_replace('#[^0-9\.\-]#', '', $liczba);//tyo cyferki i kropka
  18. return $value;
  19. }
  20.  
  21.  


Mam też takąfunkcje, która wygenerowąła mi poprawny xml, jednak nie wiem czy bedzie to dobre rozwiazanie. Jak pojawi się jakiśinny znak spoza tej tablicy bedzie problem.


  1. function polskie_znaki($string) {//zamienia polskie literki z ajaxa; $przelocznik
  2.  
  3. $specialChars = [
  4. 'Ä?',
  5. 'Ä?',
  6. 'Ĺş',
  7. 'Ĺą',
  8. 'Ĺź',
  9. 'Ĺ?',
  10. 'Ĺ?',
  11. 'Ĺš',
  12. 'Ä?',
  13. 'Ä?',
  14. 'Ä?',
  15. 'Ę',
  16. 'Ĺ?',
  17. 'Ń',
  18. 'Ĺ?',
  19. 'Ł',
  20. 'Ăł',
  21. 'Ă?',
  22. ];
  23.  
  24. $polishHtmlCodes = [
  25. 'ą',
  26. 'Ą',
  27. 'ź',
  28. 'Ź',
  29. 'ż',
  30. 'Ż',
  31. 'ś',
  32. 'Ś',
  33. 'ć',
  34. 'Ć',
  35. 'ę',
  36. 'Ę',
  37. 'ń',
  38. 'Ń',
  39. 'ł',
  40. 'Ł',
  41. 'ó',
  42. 'Ó',
  43. ];
  44.  
  45. return str_replace($specialChars, $polishHtmlCodes, $string);
  46. }
  47.  
SmokAnalog
Nie do końca rozumiem o co Ci chodzi.

Zrobiłem mały test z takim plikiem XML (input.xml):

  1. <?xml version="1.0"?>
  2. <catalog>
  3. <book>
  4. <title>Łódź w śwince źródlanej</title>
  5. </book>
  6. </catalog>


  1. $xml = file_get_contents('input.xml');
  2. $dom = new DOMDocument('1.0', 'UTF-8');
  3. $dom->loadXML($xml);
  4. $dom->save('output.xml');


Wynik w output.xml:

  1. <?xml version="1.0"?>
  2. <catalog>
  3. <book>
  4. <title>&#x141;&#xF3;d&#x17A; w &#x15B;wince &#x17A;r&#xF3;dlanej</title>
  5. </book>
  6. </catalog>


Wygląda na to, że działa to prawidłowo. O ile mi wiadomo, polskie (i jakiekolwiek inne akcentowane) znaki nie powinny się pojawiać w pliku XML. Ale plik zapisał te znaki poprawnie w formie encji szesnastkowych.
luis2luis
Cytat(SmokAnalog @ 19.08.2020, 11:04:18 ) *
Wynik w output.xml:

  1. <?xml version="1.0"?>
  2. <catalog>
  3. <book>
  4. <title>Łódź w śwince źródlanej</title>
  5. </book>
  6. </catalog>


Wygląda na to, że działa to prawidłowo. O ile mi wiadomo, polskie (i jakiekolwiek inne akcentowane) znaki nie powinny się pojawiać w pliku XML. Ale plik zapisał te znaki poprawnie w formie encji szesnastkowych.


Dziekuje bardzo za fatygę. Również otrzymałem taki wynik, jednak system, który pobiera ten plik odrzuca go.

Dostałem komunikat:
Cytat
As we checked, the error was caused by the contents in Description, which should only include numbers and letters


Czyli potrzebują tylko literki i cyfry smile.gif Więc można zapisać ten plik xml w innym formacie niż encji szesnastkowych?
trueblue
A może komunikat jest mylący, a Description zawiera inny problematyczny znak?
SmokAnalog
Tylko litery i cyfry, ale to w jakimś systemie zewnętrznym, który czyta Twój XML? Jeśli tak, to problemem (o ile czytają XML prawidłowo) nie jest jego reprezentacja, tylko treść, którą im wysyłasz. Może w ogóle nie obsługują polskich znaków, tylko mają jakiś zwykły regex [a-zA-Z0-9]+? Dziwna sprawa. Napisz coś więcej co robisz z tym XML-em.
luis2luis
Cytat(trueblue @ 19.08.2020, 11:34:29 ) *
A może komunikat jest mylący, a Description zawiera inny problematyczny znak?


Pole description to znacznik z opisem. Problemem są tu właśnie Polskie znaki zapisane w sposób: &#x141;&#xF3;d&#x17A;

Myślę, żeby Polskie znaczki usunąć albo zapisać je nie za pomocą formatu: &#x141;
SmokAnalog
Musisz rozdzielić dwie rzeczy. Format zapisu a treść to są osobne sprawy.

Zakładam, że system, który konsumuje Twój XML działa prawidłowo. Jeśli tak jest, to sposób zapisu - o ile zgodny ze standardami XML - ich nie powinien obchodzić. Interesuje ich wyłącznie treść poszczególnych pól, np. Description. Trudno z Twojego posta wywnioskować o co chodzi z tym Description, ale trochę dziwne mi się wydaje, żeby pole z opisem (ang, description) przyjmowało tylko litery i cyfry.
luis2luis
Cytat(SmokAnalog @ 19.08.2020, 11:43:29 ) *
Musisz rozdzielić dwie rzeczy. Format zapisu a treść to są osobne sprawy.

Zakładam, że system, który konsumuje Twój XML działa prawidłowo. Jeśli tak jest, to sposób zapisu - o ile zgodny ze standardami XML - ich nie powinien obchodzić. Interesuje ich wyłącznie treść poszczególnych pól, np. Description. Trudno z Twojego posta wywnioskować o co chodzi z tym Description, ale trochę dziwne mi się wydaje, żeby pole z opisem (ang, description) przyjmowało tylko litery i cyfry.



Description to jest jeden z Tagów. I problemem jest treść tego znacznika a mianowicie Polskie znaki w nim użyte zapisasne w sposób: Łódź
  1. <?xml version="1.0"?>
  2. <catalog>
  3. <book>
  4. <Description>Treśc znacznika </Description>
  5. <title>Łódź w śwince źródlanej</title>
  6. </book>
  7. </catalog>
SmokAnalog
A próbowałeś na sucho wysłać te polskie znaki w różnych formach, czyli bezpośrednio, dziesiętnie i heksadecymalnie?
trueblue
Chodziło mi o to, czy już po zamianie na encje nie pozostaje jakiś znak, który skutkuje takim komunikatem (on jest przyczyną, a nie encje).
luis2luis
Cytat(trueblue @ 19.08.2020, 13:04:18 ) *
Chodziło mi o to, czy już po zamianie na encje nie pozostaje jakiś znak, który skutkuje takim komunikatem (on jest przyczyną, a nie encje).

Wg komunikatu w tagu tym mogą być tylko cyfry i litery więc znak np & który jest częścią znaku powoduje błąd.
SmokAnalog
Cytat(luis2luis @ 19.08.2020, 13:19:40 ) *
Wg komunikatu w tagu tym mogą być tylko cyfry i litery więc znak np & który jest częścią znaku powoduje błąd.

Przeczytaj jeszcze raz to, co napisałem wyżej. Jeżeli jest tak jak mówisz, to ten system ma kompletnie bezsensowną walidację. Walidacja oparta na reprezentacji wartości jest idiotyczna. Jestem na 99% pewien, że nie o to chodzi.

Dobrze, więc z tego co mówisz, ten system pozwala na litery i cyfry. Czy testujesz na takiej wartości, tj. na literach i cyfrach? Bo jak wstawiłem powyższy przykład ze świnką, to testowałeś na nim, a przecież tam jest spacja. Spacja nie należy ani do liter, ani do cyfr, prawda?

Zrób prosty test - spróbuj wstawić wartość abc jako Description i zobacz czy przyjmie. Pewnie przyjmie. To teraz spróbuj wstawić wartość & #97;& #98;& #99; (usuń spacje - musiałem je wstawić, bo ten durny system forum ślepo zamienia wszystko), która jest po prostu inaczej zapisanym abc.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.