Encoding van speciale characters

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 12:38:02
Quote Anchor link
Hallo,

Ik krijg data vanuit een Oracle database aangeleverd als:
Angélique, Samão, Tümos.

Deze plaats ik 1 : 1 in de MySQL database. Deze namen zoals hierboven staan ook letterlijk in MySQL database.
Vervolgens wil ik die presenteren middels HTML, met htmlentities. (De andere method htmlspecialchars heb ik ook geprobeerd.)

Zonder deze functie krijg ik vreemde karakters.

Maar met deze functie gaan de namen als Angélique, Samão correct, echter de naam Tümos wordt T�mos!!???

Ik heb gegoogled, met verschillende character sets gespeeld, niets helpt.

Heeft iemand een idee waar dit aan zou kunnen liggen.

Nico
 
PHP hulp

PHP hulp

29/03/2024 11:50:06
 
- Ariën  -
Beheerder

- Ariën -

23/11/2018 12:45:34
Quote Anchor link
Hoe is de ondersteuning voor UTF-8 overal ingesteld? Denk aan je database, connectie, je bestandsencoding, en je HTML-document.

Als een daarvan niet UTF-8 geschikt is, zal je zulke vreemde karakters zien.
 
- DHU -

- DHU -

23/11/2018 13:37:58
Quote Anchor link
Ik loop hier ook tegenaan... @Arien. Je hebt het hierover dat we ook moeten denken aan de database en connectie.. is het dan niet vodoende om de
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<meta charset="utf-8" />
alleen op te nemen? kan je daar wat meer over vertellen?
 
Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 14:35:27
Quote Anchor link
Ik weet niet of ik je goed begrijp maar de collatie voor die tabel stond op 'latin1 - default collation'. deze heb ik (voor test) gezet op 'UTF - default collation'.

--
De html page stond op de 'korte' versie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
<meta charset="utf-8" />
?>

heb ik veranderd in de 'lange' versie:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
?>


Ik neem dat is wat je bedoeld Ariën of nog iets anders?

Maar wat ik enerzijds niet goed begrijp is dat é en ã correct geconverteerd worden en ü niet? Dat vind ik opmerkelijk in deze.

Nico
Gewijzigd op 23/11/2018 14:38:35 door nkamp Kamp van de
 
- Ariën  -
Beheerder

- Ariën -

23/11/2018 14:38:33
Quote Anchor link
En heb je ook de character-set bij de databaseconnectie goed ingesteld?
 
Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 15:08:15
Quote Anchor link
Dit zojuist gedraaid:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
ALTER DATABASE `databasenaam` CHARACTER SET utf8 COLLATE utf8_general_ci;
?>


Vervolgens dit uitgevoerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
SHOW VARIABLES;
?>


Met als resultaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
# Variable_name, Value

character_set_client, 'utf8'
character_set_connection, 'utf8'
character_set_database, 'utf8'
character_set_filesystem, 'binary'
character_set_results, 'utf8'
character_set_server, 'latin1'
character_set_system, 'utf8'
character_sets_dir, 'C:\\xampp\\mysql\\share\\charsets\\'
collation_connection, 'utf8_general_ci'
collation_database, 'utf8_general_ci'
collation_server, 'latin1_swedish_ci'
?>


De connectie staat ook op UTF-8. Ik heb voor de zekerheid MySQL nog een keer gestopt en geherstart.

Nico
 
- Ariën  -
Beheerder

- Ariën -

23/11/2018 15:15:27
Quote Anchor link
En zijn je tabellen ook allemaal voorzien van de juiste collatie?
 
Ozzie PHP

Ozzie PHP

23/11/2018 15:25:09
Quote Anchor link
Gebruik je MySqli ?
 
Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 15:39:48
Quote Anchor link
Ik dacht door het eerdere statement 'ALTER DATABASE...' uit te voeren dat alles naar character set UTF-8 resp. collate utf8_unicode_ci gezet was, wat dus niet zo was.

Nu heb ik dit specifiek voor de tabel uitgevoerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
alter table `<tabel naam>` convert to character set utf8 collate utf8_unicode_ci;
?>


TABLE_TYPE = BASE TABLE
ENGINE = MyISAM
TABLE COLLATION = utf8_unicode_ci

En euh... nee dit is geen MySQLi, maar nog MySQL. Ok let op, mocht dit het probleem vormen... dit is een applicatie die vervangen GAAT worden door PHP7, maar in de tussentijd moet dit nog wel blijven werken. Is ook oud PHP5.1 - weet ik, weet ik, weet ik

Maar stel dat MySQLi het probleem is waarom wordt dan het ene karakter als é resp. ã correct geconverteerd en ü niet?
 
Ozzie PHP

Ozzie PHP

23/11/2018 15:50:25
Quote Anchor link
Laat eens zien hoe je je database-connectie maakt.
 
Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 16:15:23
Quote Anchor link
Ik wil mij niet verschuilen maar dit is code die al 'jaren' geleden door mijn voorgangers geïmplementeerd is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
function fr_mysql_connection($user,$pass,$db,$host) {
    if($link=mysql_connect($host,$user,$pass)) {
        if (mysql_select_db($db,$link)) {
            return($link);
        }
    }

    return(FALSE);
}


?>

En deze $link wordt in een $GLOBAL['db_connecties'][$database_type][$connection_name] geplaatst. Ik heb dit ook nog nooit zo gezien maar het werkt, al heb ik hier niet een goed gevoel bij of dit een goeie manier is. Maar zoals ik zei het werkt.
?>
Gewijzigd op 23/11/2018 16:16:04 door nkamp Kamp van de
 
Ozzie PHP

Ozzie PHP

23/11/2018 16:26:56
Quote Anchor link
Maak er eens dit van.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function fr_mysql_connection($user,$pass,$db,$host) {
    if($link=mysql_connect($host,$user,$pass)) {
        mysql_set_charset('utf8', $link);
        if (mysql_select_db($db,$link)) {
            return($link);
        }
    }

    return(FALSE);
}


?>

Helpt dat?
Gewijzigd op 23/11/2018 16:30:53 door Ozzie PHP
 
Ben van Velzen

Ben van Velzen

23/11/2018 16:31:50
Quote Anchor link
mysqli in combinatie met mysql? Hmmz. Dan gaat dit beter denk ik:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
function fr_mysql_connection($user,$pass,$db,$host) {
    if($link=mysql_connect($host,$user,$pass)) {
        mysql_set_charset('utf8', $link);
        if (mysql_select_db($db,$link)) {
            return($link);
        }
    }

    return(FALSE);
}


?>
 
Ozzie PHP

Ozzie PHP

23/11/2018 16:36:19
Quote Anchor link
@Ben

Wat is het verschil?
 
Thomas van den Heuvel

Thomas van den Heuvel

23/11/2018 16:38:50
Quote Anchor link
¡Ay, caramba!

Wanneer de data niet goed geïmporteerd is maakt het niet uit wat je doet. MySQL gaat er immers vanuit dat deze correct geëncodeerd is. Hier een ALTER TABLE overheen gooien gaat je probleem niet oplossen. De collation heeft hier helemaal niets mee te maken - collation gaat over sorteren en matching, niet over de character encodering zelf.

De enige remedie is de data correct importeren of repareren.

En vervolgens is het zaak dat je deze op de juiste manier weergeeft, anders zie je nog steeds wiebertjes, vraagtekens en andere vreemde karakters op je scherm, maar dat heeft dan dus weer niets met het wel of niet juist geëncodeerd zijn te maken...

Nota Bene: utf8 is een subset van UTF-8 dus uit oogpunt van maximale compatibiliteit is het misschien beter om alle tabellen op te zetten als utf8mb4.
Gewijzigd op 23/11/2018 16:48:02 door Thomas van den Heuvel
 
Ben van Velzen

Ben van Velzen

23/11/2018 17:00:58
Quote Anchor link
@Ozzie mysqli functies zijn niet compatible met mysql functies. Dat is het verschil.
 
Ozzie PHP

Ozzie PHP

23/11/2018 17:12:55
Quote Anchor link
@Ben

Snap ik, maar ik bedoel wat het verschil is tussen jouw en mijn code. Ik kijk blijkbaar ergens overheen.
 
Nkamp Kamp van de

nkamp Kamp van de

23/11/2018 17:14:58
Quote Anchor link
Grappig door deze aanpassing wordt nu het karakter 'ü' wel correct weergegeven maar het karakter 'é' wordt nu weer als 'é' weer gegeven. Dus het wel degelijk invloed.

@Thomas wanneer is de data niet goed geïmporteerd? Ik bedoel ik haal de data op vanuit een Oracle database. Daarin staat het op deze wijze é, ü, ã. Zo heb ik het nu ook letterlijk in mijn MySQL database nu staan weliswaar mbv. de functie 'mysql_real_escape_string'.

Dus denk ik nu: het staat letterlijk hetzelfde in twee dBsen en dus is het goed, of...?
Nu wil ik het presenteren op het scherm en dan gaat het fout...

Of bedoel je nu te zeggen dat ik het met 'wiebertjes/vraagtekens' in de MySQL database moet weg schrijven?

Overigens wat is nu de beste of meest geschikte:
- collatie?
- karakterset?
- database engine?

En wat zet je dan in je HTML page, zodat het altijd werkt?

Zijn daar regels voor?
 
Ozzie PHP

Ozzie PHP

23/11/2018 17:19:58
Quote Anchor link
Dit moet in de head van je html-pagina staan:

<meta charset="UTF-8">
 
Thomas van den Heuvel

Thomas van den Heuvel

23/11/2018 21:00:00
Quote Anchor link
Once more, from the top.

Allereerst is het handig als duidelijk is wat een character encoding is (interne link), en vervolgens de realisatie dat alle tekst een character encoding heeft.

Afhankelijk van character encoding is de ene é de andere niet op byte-niveau.

Ook jouw Oracle database houdt een bepaalde character encoding aan. Een eerste stap voor correcte import zou het uitvogelen van de character encoding zijn.

Dan set_charset(X). Je moet set_charset(X) zien als het contract tussen jou en je MySQL-database. Hiermee leg je vast dat:
- jij data aanlevert met character encoding X
- MySQL haar best doet om alle data terug te geven met character encoding X

Wanneer jij geen character encoding instelt bij het maken van een connectie veronderstelt MySQL waarschijnlijk de default character encoding "latin1". MySQL is zelf best slim. Als deze ziet dat jij dus wilt communiceren in "latin1" maar de data in jouw tabellen zijn utf8 dan zal MySQL:
- als deze data ontvangt omzetten naar utf8
- als deze data uitgeeft weer terug vertalen naar latin1

MySQL gaat hier verder wel uit van correct geëncodeerde data. Als deze niet klopt kun je ook niet verwachten dat MySQL dit voor je rechtbuigt (al dan niet met vertalingen tussen verschillende character encoderingen). Het is beter om dingen altijd expliciet in te stellen in plaats van uit te gaan van mogelijk afwijkende defaults.

Hiernaast is het handig om dus alles in de pas te laten lopen:
- de connectie met je database
- de databasetabellen
- de DATA in de tabellen :p
- Content-Type header en/of meta tag

En ja, collation is iets anders dan character encodering (interne link).
Gewijzigd op 23/11/2018 21:11:19 door Thomas van den Heuvel
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.