Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MSSQL -> PHP encoding problem

[es] :: PHP :: MSSQL -> PHP encoding problem

[ Pregleda: 1628 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

ksrele
Programer - informatičar
Gold Drink D.O.O. Subotica
Subotica

Član broj: 14253
Poruke: 1608
79.101.107.*

ICQ: 66444502


+44 Profil

icon MSSQL -> PHP encoding problem30.07.2014. u 08:11 - pre 73 meseci
Imam SQL server verzije 2008 R2 sa podacima na njemu. Podaci su ubacivani Windows (VB) aplikacijom koju nisam ja pravio i nemam pristup izvornom kodu.
Moj zadatak je da PHP-om izvlacim te podatke iz baze i (sortiram, povezujem tabele itd) prikazujem ih na web stranici.

Kao sto vidite iz naslova problem je encoding. Pokusao sam mnogo (verovatno ne sve) nacina konverzije i sa iconv() funkcijom i sa mb_convert_encoding() funkcijom ali nikako da dobijem dobre rezultate.

Kada tekst ispisujem bez ikakve konverzije dobijem ovo:
Citat:
Neoplanta Pile�a pa?teta


Onda sam nekako provalio da mogu da konvertujem pomocu str_replace() funkcije i dva niza, pa sam skontao da ni to nije 100% dovoljno, pa sam odradio i neku konverziju sa iconv()... znaci zakomplikovao sam zesce, ali je to donekle i radilo.
Slova š i veliko Đ nisam morao da konertujem jer su ona bila OK.

E onda smo na PHP serveru promenili OS, instalirali noviji (Centos7) i noviji PHP i Apache i sada imam problema sa svim slovima. Znaci ludim. Nemam pojma kako da prekonvertujem ova glupa slova. A tek kakve cu muke imati kada budem hteo da unosim novi tekst to tek mogu da zamislim...

Ako mozete, pomozite mi nekako.

Ovo je kod koji sam do sada koristio za konverziju a koji na novom serveru vise ne radi kako treba:
Code:

function str_conv($str)
{
   $search_letters  = array("È", "Æ", "è", "æ", "ð");
   $replace_letters = array("Č", "Ć", "č", "ć", "đ");

   $str = iconv("CP1252", "UTF-8", $str);
   $return = str_replace($search_letters, $replace_letters, $str);
   
   return $return
}
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 400
89.216.28.*



+44 Profil

icon Re: MSSQL -> PHP encoding problem30.07.2014. u 08:22 - pre 73 meseci
Kako izgledaju podaci u bazi podataka?

Prilikom konektovanja sa bazom koristi sledeći upit:
Code:
SET NAMES 'utf8'

ili
Code:
$pdo = new PDO('dblib:host=localhost;dbname=databasename;charset=UTF-8', 'username', 'password');

(windows)
Code:
$sth->setAttribute(PDO::SQLSRV_ATTR_ENCODING, PDO::SQLSRV_ENCODING_UTF8);


Takodje, u HTML-u proveri meta tagove:
Code:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

ksrele
Programer - informatičar
Gold Drink D.O.O. Subotica
Subotica

Član broj: 14253
Poruke: 1608
79.101.107.*

ICQ: 66444502


+44 Profil

icon Re: MSSQL -> PHP encoding problem30.07.2014. u 09:09 - pre 73 meseci
Ovako:
1. HTML header je dobro podesen
2. PHP aplikacije koje su vec napisane (ima ih poprilicno) koriste mssql_query() odnosno php-mssql extenziju za konekciju na mssql server. OGROMAN mi je posao prebacivati to sve u nesto drugo.
3. Posle dodavanja sledeceg koda:
Code:

mssql_query("SET NAMES 'utf8'")
  or die("Error:".mssql_get_last_message());

dobijem ovakav odgovor:
Citat:

Warning: mssql_query(): message: 'NAMES' is not a recognized SET option. (severity 15) in /var/www/html/mesecni_izvestaji/db.php on line 15

Warning: mssql_query(): General SQL Server error: Check messages from the SQL Server (severity 15) in /var/www/html/mesecni_izvestaji/db.php on line 15

Warning: mssql_query(): Query failed in /var/www/html/mesecni_izvestaji/db.php on line 15
Error:'NAMES' is not a recognized SET option.
 
Odgovor na temu

ivan.a
PHP developer

Član broj: 83976
Poruke: 400
89.216.28.*



+44 Profil

icon Re: MSSQL -> PHP encoding problem30.07.2014. u 11:23 - pre 73 meseci
Ne možeš koristiti taj upit sa mssql_query funkcijom.

Mislim da prvo trebaš proveriti podatke u bazi...da li su upisani sa validnim encoding-om ili ne (da li u bazi stoje podaci sa znakovima kao što su "È", "Æ", "è", "æ", "ð" ili se prikazuju samo prilikom HTML output-a)?

Takodje, proveri da li imaš neki znak (može biti i prazno mesto ili "nevidljiv" znak) pre HTML-a. Ovo može biti teško za debugovanje, pogotovo ako imaš puno .php fajlova a negde si slučajno ostavio jedno prazno mesto posle zatvaranja php tagova.


I hope I didn't brain my damage - Homer
if (wife.position == kitchen) {return sandwich};
 
Odgovor na temu

ksrele
Programer - informatičar
Gold Drink D.O.O. Subotica
Subotica

Član broj: 14253
Poruke: 1608
79.101.107.*

ICQ: 66444502


+44 Profil

icon Re: MSSQL -> PHP encoding problem30.07.2014. u 11:56 - pre 73 meseci
Da, da, upravo kada gledam iz SQL Management Studija vidim ta slova u bazi, dok windows applikacija sa kojom su se unosili ovi podaci njih vidi sasvim normalno.

Sto se tice praznog mesta pre HTML ispisa, imam slucaj gde sam .php file poceo upravo prvo sa ovim linijama
Code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>

Pa tek onda ide <?php tag i PHP kod.


Zaista ne znam sta da radim... vec ludim.

Nego, kazite vi meni sta je alternativa za php-mssql extenziju ako je PHP server na Linux-u? Mozda neka druga extenzija ima bolju podrsku za UTF-8.
 
Odgovor na temu

ksrele
Programer - informatičar
Gold Drink D.O.O. Subotica
Subotica

Član broj: 14253
Poruke: 1608
79.101.107.*

ICQ: 66444502


+44 Profil

icon Re: MSSQL -> PHP encoding problem30.07.2014. u 12:42 - pre 73 meseci
Dok ja cekam da mi neko pomogne, evo kako sam sam resio problem:

Prvo sam napisao ovakav upit:
Code:

$query = "SELECT 
                REPLACE(    
                    REPLACE(    
                        REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                                REPLACE(
                                                        REPLACE(RAD_IME COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(263),'#263') 
                                                COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(262),'#262') 
                                        COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(268),'#268')
                                    COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(269),'#269')
                            COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(352),'#352') 
                        COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(353),'#353')
                    COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(381),'#381')
                COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(382),'#382') AS RAD_IME,
                    

                REPLACE(    
                    REPLACE(    
                        REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                                REPLACE(
                                                        REPLACE(RAD_PREZIME COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(263),'#263') 
                                                COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(262),'#262') 
                                        COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(268),'#268')
                                    COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(269),'#269')
                            COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(352),'#352') 
                        COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(353),'#353')
                    COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(381),'#381')
                COLLATE SQL_Latin1_General_CP1_CS_AS,NCHAR(382),'#382') AS RAD_PREZIME


Zatim sam to prekonvertovao sa ovom funkcijom (gde su sve vec moguce i nemoguce kombinacije):
Code:

function str_conv($str)
{
    
    $str = @iconv("CP1252", "UTF-8", $str);

    $search_letters  = array("È", "Æ", "è", "æ", "ð", "#262", "#263", "#268", "#269", "#272", "#273","#352","#353","#381","#382", "č" ,"ÄŒ","ć","ć","ž","Ž","Å¡","Å","Ä‘","Đ");
    $replace_letters = array("Č", "Ć", "č", "ć", "đ", "Ć"   , "ć"   , "Č"   , "č"   ,  "Đ"  , "đ"   ,"Š"   ,"š"   ,    "Ž"     , "ž"     , "č" ,"Č" ,"ć" ,"Ć" ,"ž" ,"Ž" ,"š" ,"Š","đ" ,"Đ");

    $str = str_replace($search_letters, $replace_letters, $str);
    
$return = mb_convert_encoding($str, "utf-8","UTF-8");

return $return;
}


A kod upisa u bazu cu koristiti ovako nesto (ovo jos nije do kraja napisano i testirano, ali kontate poentu):
-prvo funkcija
Code:

function str_conv_inv($str)
{
    
    $search_letters  = array("Ć"             , "ć"               , "Č"             , "č"               ,  "Đ"             , "đ"   , "š"              ,"Š"             );
    $replace_letters = array("'+NCHAR(262)+'", "'+NCHAR(263)+'", "'+NCHAR(268)+'", "'+NCHAR(269)+'", "'+NCHAR(272)+'", "#273","'+NCHAR(353)+'","'+NCHAR(352)+'");

    $return = str_replace($search_letters, $replace_letters, $str);

    return $return;
}

-zatim sam INSERT u bazu:
Code:

$first_name = str_conv_inv($first_name);
$last_name = str_conv_inv($last_name);

$query = "INSERT INTO person (jobTitle,firstName,lastName,type) VALUES ('',N'$first_name',N'$last_name',N'$type')";




[Ovu poruku je menjao ksrele dana 30.07.2014. u 14:06 GMT+1]
 
Odgovor na temu

[es] :: PHP :: MSSQL -> PHP encoding problem

[ Pregleda: 1628 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.