Speciale karakters
Nu schrijf ik bijvoorbeeld: In Israël heeft Hamid familie.
Als ik in mijn database kijk, wordt dat opgeslagen als: In Israël heeft Hamid familie.
Nu komt de vraag. Ik gebruik al de volgende code voor het omzetten van spaties:
Mocht ik die e met puntjes om willen zetten van ë naar \'eb
Hoe zorg ik er dan voor dat mijn code niet met het teken ' in de knoei komt?
Kijk hier even voor een basis. Want de e umlaut kan gewoon gebruikt worden, :http://www.atto.nl/utf8/index.php
Daan Vee op 06/04/2018 10:12:03:
Als ik in mijn database kijk, wordt dat opgeslagen als: In Israël heeft Hamid familie.
Dan gaat het daar dus al mis: je vervormt je invoer kennelijk al bij het opslaan. Dat is nergens voor nodig en zoals nu blijkt, onwenselijk.
je gebruikt dus kennelijk als een soort escaping htmlentities() bij je insert-query. Haal dat weg, en in je database zal gewoon ë komen ipv. ë
(daarbij kan het wel van belang zijn, om overal dezelfde karakterset te gebruiken)
Toevoeging op 06/04/2018 11:00:25:
en dan kun je de karaktercode van de ë gebruiken om de juiste (hex) waarde te vinden:
ord() werkt alleen bij ascii code. Hier zul je waarschijnlijk mb_ord() nodig hebben.
Dat zou dan 00eb moeten leveren.
alternatief: mogelijk kun je middels html_entities() met de juiste flags op ë uitkomen
http://www.fileformat.info/info/unicode/char/eb/index.htm
ik zou niet gaan voor een letter voor letter omzetting, want dan heb je naast ë ook é en è en zelfs ê. En dat ook voor de o a en u.
Maar dan mis je nog de ñ en ç
en dan blijf je bezig
Wat nu nog overblijft is dat ik die ë nog moet omzetten naar: \'eb
Hoe doe ik dat met die preg_replace?
probeer eens: str_replace( 'ë','ë' , $tekst);
Daardoor komt er ë in de database te staan in plaats van een e met puntjes.
Als ik het volgende gebruik gaat het wel goed en komt er een e met puntjes in de database:
Maar ik wil wel een real_escape_string-achtig iets houden, om te zorgen dat er geen errors kunnen komen als mensen ' en " gebruiken.
Hoe kan ik daarvoor zorgen?
Toevoeging op 06/04/2018 12:06:24:
Ivo P: het moet met php van UTF-8 omgezet worden naar het formaat dat gebruikt wordt in een RTF-bestand (ASCII dacht ik). Weet jij hoe dat heet? Dan zouden de karakters juist omgezet zijn lijkt me.
Daan Vee op 06/04/2018 11:24:20:
Daardoor komt er ë in de database te staan in plaats van een e met puntjes.
Dan heb jij een hele rare versie van php.
mysqli_real_escape_string moet iets doen met quotes: ' naar \' om het simpel te zeggen.
ë naar ë komt door htmlentities()
Toevoeging op 06/04/2018 12:13:45:
een voorbeeldje dat ik vond:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$str = "ë";
echo preg_replace('/[^!-%\x27-;=?-~ ]/e', 'ord("$0")', html_entity_decode($str));
?>
$str = "ë";
echo preg_replace('/[^!-%\x27-;=?-~ ]/e', 'ord("$0")', html_entity_decode($str));
?>
Levert dat 235 op bij jou?
Tëst zou volgens mijn editor naar rtf vertalen als: T\u235\'ebst
Dan zou je de 235 achter \u kunnen plaatsen. En eb is de hex- presentatie van 235.
De ë komt nu goed in de database.
Vervolgens:
Ik wil de ë uit de database kunnen halen en omzetten naar een ë die RTF leest.
Welke code gebruik ik daarvoor? Ik wil niet per letter alles moeten omzetten.
NB: Als ik het rtf-bestand open in bijvoorbeeld dreamwaever en de code uitlees zie ik \'eb staan op de plek van de ë.
Gewijzigd op 06/04/2018 13:39:16 door Daan Vee
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Toevoeging op 06/04/2018 14:22:03:
dit levert
als output, wat volgens mijn editor eruit zou moeten komen. Uit je vraag begrijp ik dat jij die \u235 niet zoekt
Daan Vee op 06/04/2018 11:24:20:
Dat lijkt mij niet, nee. De enige redenen die ik kan bedenken dat ë in je database terecht komt zijn:
- iemand heeft letterlijk "ë" ingevuld in plaats van "ë"
- er wordt ergens htmlentities() over $_POST heengehaald, mogelijk in een "sanitize-functie" die veel te veel werk verzet
Dit laatste heet ook wel escape-on-input. Je geeft zelf een mooi voorbeeld waarom dat geen goede aanpak is: op het moment dat je de data in je database in een ander formaat dan HTML moet stoppen moet je al deze HTML-specifieke vertalingen weer ongedaan maken. Daarom is het verstandiger om de data zo rauw/ongewijzigd mogelijk in je database te stoppen. Hier heeft real_escape_string() niets mee te maken, dit zorgt er (maar toch alleen in combinatie met quotes) voor dat ingevoerde DATA niet wordt geïnterpreteerd wordt als SQL, en dat is weer handig als je SQL-injectie wilt voorkomen.
Zoek alleen nog de omzetting naar rtf-code via PHP....
mb_ord() is wel een functie die pas kort in PHP zit.
Maar $html wordt alsnog uitgespuugd als een ë en niet als \u235\'eb of iets dergelijks....
Doe ik iets fout?
Gewijzigd op 06/04/2018 22:43:41 door Ben van Velzen
Nu wil je teveel tegelijkertijd - deel dit soort zaken op in deelproblemen. Zorg eerst dat het werkt met een statische test-tekst, en voeg dan pas het database-gedeelte toe, waarbij de test-tekst uit de database komt. Hiermee creëer je een stuk meer overzicht voor jezelf en voor de kijkers thuis, want het is nu volstrekt onduidelijk wat er allemaal op de achtergrond gebeurt.
Ik gebruik nu:
Daar komt dus utf8 uit lijkt me.
Hoe kan ik nu in een keer die hele zin omzetten geschikt voor rtf-bestanden? Want ik wil niet per karakter gaan werken.
Daan Vee op 07/04/2018 10:24:51:
Ik gebruik nu:
Daar komt dus utf8 uit lijkt me.
Daar komt dus utf8 uit lijkt me.
Nee, niet per se. Het hangt er maar helemaal vanaf hoe het bronbestand waarin die code staat is opgeslagen. Als het bronbestand opgeslagen was als UTF-8 dan leidt utf8_encode() tot een dubbele encodering.
Oh, misschien is het resultaat wel "UTF-8", maar dat kan ook inhouden dat $string door de vleesmolen gaat en hier onleesbare tekst uitrolt.
Alle vormen van tekst hebben een character encoding, zo ook jouw bronbestand. utf8_encode() gaat ook uit van een bepaalde encodering: ISO-8859-1.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
function openDB($table = DB_NAME) {
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, $table);
$db->set_charset('latin1');
$db->query("SET collation_connection = latin1_swedish_ci");
return $db;
}
$db = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, $table);
$db->set_charset('latin1');
$db->query("SET collation_connection = latin1_swedish_ci");
return $db;
}
Dus expliceit aangeven wat de karaktercodering moet zijn.
Bij jou misschien een andere karakterdefinitie.
Een schone string met speciale karakters als ë â õ of schrijf ik weg zonder poespas.
Verder geen gerommel met escaping, html-entities of wat dan ook.
PHPAdmin laat ze netje zien.
En het uitlezen geeft direct in HTML het karakter zoals het bedoeld is.