Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Pobieranie danych i krzaki
masterix
post
Post #1





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

Ostrzeżenie: (0%)
-----


Witam,

Pobieram sobie dane za pomocą cURL'a ze strony, która ma ustawione kodowanie znaków na windows-1250. W bazie mam ustawione wszystko na latin2( do tej bazy zapisuję pobrane dane ). No i jak pobieram z bazy to na stronie mam krzaczki ( kodowanie iso-8859-2 ). Dałem zapytanie tuż po połączeniu z bazą:
Kod:
  1. SET CHARSET latin2

ale to niewiele pomogło.

Czy można coś na to poradzić? Czy jestem zmuszony zmienić kodowanie na swojej stronie i w bazie danych?

pzdr.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
misiek172
post
Post #2





Grupa: Zarejestrowani
Postów: 656
Pomógł: 3
Dołączył: 26.10.2005
Skąd: Częstochowa

Ostrzeżenie: (0%)
-----


nie kodowania do końca nie musisz zmieniać winksmiley.jpg

możesz po prostu zamień krzaczki na normalne literki poprzez funkcje str_replace


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
babejsza
post
Post #3





Grupa: Zarejestrowani
Postów: 407
Pomógł: 1
Dołączył: 4.03.2003
Skąd: warszawa

Ostrzeżenie: (0%)
-----


iconv" title="Zobacz w manualu PHP" target="_manual
Go to the top of the page
+Quote Post
masterix
post
Post #4





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

Ostrzeżenie: (0%)
-----


Sytuacja się nieco zmieniła. Teraz mam wszędzie UTF-8 w bazie danych( utf8_polish_ci ). Pobieram ze strony, która ma kodowanie windows-1250 i po pobraniu konwertuję od razu:
  1. <?php
  2. $name =  iconv( "CP1250", "UTF-8", $title .' - ' .$names[0] );//mb_convert_encoding( $title .' - ' .$names[0], "UTF-8" );//
  3. ?>
W komentarzu inny sposób, który nie działał. Zamiast CP1250 dawałem też windows-1250 z tym samym efektem niestety.

Jakieś pomysły?

@misiek: a masz taką 'bazę' krzaczków, żebym wiedział co na co podmienić ?

Daję cały kod:
  1. <?php
  2. //session_start();
  3. require_once( '../inc/config.php' );
  4. function convert( $strString )
  5. {
  6. $win2utf = array(
  7. "xb9" => "xc4x85", "xa5" => "xc4x84",
  8. "xe6" => "xc4x87", "xc6" => "xc4x86",
  9. "xea" => "xc4x99", "xca" => "xc4x98",
  10. "xb3" => "xc5x82", "xa3" => "xc5x81",
  11. "xf3" => "xc3xb3", "xd3" => "xc3x93",
  12. "x9c" => "xc5x9b", "x8c" => "xc5x9a",
  13. "xbf" => "xc5xbc", "x8f" => "xc5xbb",
  14. "x9f" => "xc5xba", "xaf" => "xc5xb9",
  15. "xf1" => "xc5x84", "xd1" => "xc5x83"
  16. );
  17.  
  18. return strtr( $strString, array_flip( $win2utf ) );
  19. }
  20. $base_addr = 'http://bap-psp.lex.pl/serwis/kodeksy/akty/';
  21. $addr_array = array( '64.9.59.htm' => 'Kodeks rodzinny i opiekuńczy', 
  22. '64.16.93.htm' => 'Kodeks cywilny',
  23. '64.43.296.htm' => 'Kodeks postępowania cywilnego',
  24. '71.12.114.htm' => 'Kodeks wykroczeń',
  25. '97.78.483.htm' => 'Konstytucja RP',
  26. '97.88.553.htm' => 'Kodeks karny',
  27. '97.89.555.htm' => 'Kodeks postępowania karnego',
  28. '97.90.557.htm' => 'Kodeks karny wykonawczy',
  29. '98.21.94.htm' => 'Kodeks pracy',
  30. '99.83.930.htm' => 'Kodeks karny skarbowy',
  31. '00.94.1037.htm' => 'Kodeks spółek handlowych',
  32. '00.98.1071.htm' => 'Kodeks postępowania administracyjnego',
  33. '01.106.1148.htm' => 'Kodeks postępowania w sprawach o wykroczenie',
  34. '01.138.1545.htm' => 'Kodeks morski');
  35.  
  36.  
  37. ?>
  38. <?echo '<?xml version="1.0" encoding="utf-8"?>
  39. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  40. <html xmlns="http://www.w3.org/1999/xhtml">
  41. <head>
  42. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  43. <title>Instalator</title>
  44. </head>
  45. <body xml:lang="pl">';
  46.  
  47. try
  48. {
  49. $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass);
  50.  
  51. $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  52. $stmt = $pdo -> prepare( 'INSERT INTO `documents`( id, type, name, year, number, text ) VALUES( null, "Konstytucja i kodeksy", :name, :year, :number, :text ) ' );
  53. $stmt -> bindParam( ':name', $name, PDO::PARAM_STR );
  54. $stmt -> bindParam( ':year', $year, PDO::PARAM_STR );
  55. $stmt -> bindParam( ':number', $number, PDO::PARAM_INT );
  56. $stmt -> bindParam( ':text', $text );
  57. }
  58. catch( PDOException $error )
  59. {
  60. die ( 'Error: '. $error -> getMessage() );
  61. }
  62.  
  63. $number = 1;
  64. $year = 0;
  65. foreach( $addr_array as $postfix => $title )
  66. {
  67. $cr_tmp = curl_init( $base_addr . $postfix );
  68. curl_setopt( $cr_tmp, CURLOPT_RETURNTRANSFER, TRUE );
  69. $law = curl_exec( $cr_tmp );
  70. curl_close( $cr_tmp );
  71. $text = substr( $law, strpos( $law, '<table class="txs">') );
  72. preg_match( '%Dz.U.[0-9]+.[0-9]+.[0-9]+%', $text, $names );
  73. $name = $title .' - ' .$names[0];//iconv( "CP1250", "UTF-8", $title .' - ' .$names[0] );//mb_convert_encoding( $title .' - ' .$names[0], "UTF-8" );//
  74. $stmt -> execute();
  75. echo $title. '<br />';
  76. ++$number;
  77. }
  78.  
  79. echo '<a href="get_statutes.php">Dalej</a>';
  80. ?>
  81. </body>
  82. </html>
To jest plik, który pobiera dane. Poniżej wyświetlanie:
  1. <?php
  2. //session_start();
  3. require_once( '../inc/config.php' );
  4.  
  5. echo '<?xml version="1.0" encoding="utf-8"?>
  6. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  7. <html xmlns="http://www.w3.org/1999/xhtml">
  8. <head>
  9. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  10. <title>Instalator</title>
  11. </head>
  12. <body xml:lang="pl">';
  13.  function convert( $strString )
  14. {
  15. $win2utf = array(
  16. "xb9" => "xc4x85", "xa5" => "xc4x84",
  17. "xe6" => "xc4x87", "xc6" => "xc4x86",
  18. "xea" => "xc4x99", "xca" => "xc4x98",
  19. "xb3" => "xc5x82", "xa3" => "xc5x81",
  20. "xf3" => "xc3xb3", "xd3" => "xc3x93",
  21. "x9c" => "xc5x9b", "x8c" => "xc5x9a",
  22. "xbf" => "xc5xbc", "x8f" => "xc5xbb",
  23. "x9f" => "xc5xba", "xaf" => "xc5xb9",
  24. "xf1" => "xc5x84", "xd1" => "xc5x83"
  25. );
  26. return strtr( $strString, array_flip( $win2utf ) );
  27. }
  28. try
  29. {
  30. $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass);
  31.  
  32. $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  33. $stmt = $pdo -> prepare( 'SELECT * FROM documents' );
  34. $stmt -> execute();
  35. while( $row = $stmt -> fetch() )
  36. {
  37. echo convert($row['name']).'<br /><br/>';
  38. }
  39. }
  40. catch( PDOException $error )
  41. {
  42. die ( 'Error: '. $error -> getMessage() );
  43. }
  44. ?>
  45. </body>
  46. </html>
Efekt jest taki, że nadal mam krzaki. Próbowałem konwertować przed zapisem do bazy co byłoby dla mnie korzystniejsze, jednak efekt był taki sami. Próbowałem iconv, mbstring oraz zmiany takiej jak jest aktualnie w kodzie. NIC nie pomogło

pzdr.

Teraz jak korzystam z iconv to raz działa a raz nie ...

Jakieś pomysły gdzie mogę robić błąd ?
Go to the top of the page
+Quote Post
marcinpl87
post
Post #5





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 22.05.2007

Ostrzeżenie: (0%)
-----


pokaż kod z iconv, który raz działa a raz nie
Go to the top of the page
+Quote Post
masterix
post
Post #6





Grupa: Zarejestrowani
Postów: 93
Pomógł: 0
Dołączył: 7.09.2004

Ostrzeżenie: (0%)
-----


  1. <?php
  2. $pdo = new PDO('mysql:host=localhost;dbname='.$db, $user, $pass);
  3.  
  4.  
  5.  
  6. $pdo -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  7.  
  8. $pdo -> query( 'SET CHARSET utf8' );
  9.  
  10. $stmt = $pdo -> prepare( 'INSERT INTO `documents`( id, type, name, year, number, text ) VALUES( null, "Konstytucja i kodeksy", :name, :year, :number, :text ) ' );
  11.  
  12. $stmt -> bindParam( ':name', $name, PDO::PARAM_STR );
  13.  
  14. $stmt -> bindParam( ':year', $year, PDO::PARAM_STR );
  15.  
  16. $stmt -> bindParam( ':number', $number, PDO::PARAM_INT );
  17.  
  18. $stmt -> bindParam( ':text', $text );
  19.  
  20.  
  21.  
  22.  
  23.  
  24. $number = 1;
  25.  
  26. $year = 0;
  27.  
  28. foreach( $addr_array as $postfix => $title )
  29.  
  30. {
  31.  
  32. $cr_tmp = curl_init( $base_addr . $postfix );
  33.  
  34. curl_setopt( $cr_tmp, CURLOPT_RETURNTRANSFER, TRUE );
  35.  
  36. $law = curl_exec( $cr_tmp );
  37.  
  38. curl_close( $cr_tmp );
  39.  
  40. $text = substr( $law, strpos( $law, '<table class="txs">') );
  41.  
  42. preg_match( '%Dz.U.[0-9]+.[0-9]+.[0-9]+%', $text, $names );
  43.  
  44. $text = iconv( "CP1250", "UTF-8", $text );
  45.  
  46. $name = $title .' - ' .$names[0];
  47.  
  48. $stmt -> execute();
  49.  
  50. //echo 
  51.  
  52. ++$number;
  53.  
  54. }
  55. ?>
Ten działa poprawnie.
  1. <?php
  2. $stmt = $pdo -> prepare( "INSERT INTO institutes VALUES( null, 'sad', :name, :district, :text ) " );
  3.  
  4. $stmt -> bindParam( ':name', $name, PDO::PARAM_STR );
  5.  
  6. $stmt -> bindParam( ':district', $district, PDO::PARAM_STR );
  7.  
  8. $stmt -> bindParam( ':text', $text, PDO::PARAM_STR );
  9.  
  10.  
  11.  
  12. $number = 0;
  13.  
  14. foreach( $urls as $url )
  15.  
  16. {
  17.  
  18. $cr = curl_init( $url );
  19.  
  20. curl_setopt( $cr, CURLOPT_RETURNTRANSFER , TRUE );
  21.  
  22. $content = curl_exec( $cr );
  23.  
  24. curl_close( $cr );
  25.  
  26. $content = substr( $content, strpos( $content, '<div class="name">') );
  27.  
  28. preg_match( '%class="name">(.*?)</div>%i', $content, $names );
  29.  
  30. $name = iconv( "CP1250", "UTF-8", $names[1] );
  31.  
  32. $text = preg_replace( '%<!--STOPKA-->(.*?)%i', '', $content );
  33.  
  34. $text = strip_tags( $text, '<div><b><p><a>' );
  35.  
  36. $text = iconv( "CP1250", "UTF-8", $text );
  37.  
  38. $district = iconv( "CP1250", "UTF-8", $districts[ $number ] );
  39.  
  40. $stmt -> execute();
  41.  
  42. ++$number;
  43.  
  44. }
  45. ?>
A ten już nie. Wg mnie to robię konwersję w ten sam sposób, Jednak w jednym przypadku to działą a w drugim nie...

W niedziałającym przypadku brakowało SET CHARSET utf8 winksmiley.jpg
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 18:41