Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pobieranie danych i krzaki
Forum PHP.pl > Forum > PHP
masterix
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.
misiek172
nie kodowania do końca nie musisz zmieniać winksmiley.jpg

możesz po prostu zamień krzaczki na normalne literki poprzez funkcje str_replace
masterix
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 ?
marcinpl87
pokaż kod z iconv, który raz działa a raz nie
masterix
  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
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.