Ik wil in een tekst die uit de database gevist wordt speciale karakters omzetten voor een rtf-bestand.

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:

$html = preg_replace("/ /",' ',$html);


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?
Vragen: staat jouw database codering goed ingesteld? En jouw htmlpagina?
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)



[size=xsmall]Toevoeging op 06/04/2018 11:00:25:[/size]

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

Dank alvast!

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);
Ik zie wat er fout gaat. Op het moment van opslaan gebeurt er dit met de tekst:

$content = mysqli_real_escape_string($conn, $_POST['content']);


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:

$content = $_POST['content']


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?



[size=xsmall]Toevoeging op 06/04/2018 12:06:24:[/size]

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()


[size=xsmall]Toevoeging op 06/04/2018 12:13:45:[/size]

een voorbeeldje dat ik vond:


<?php
$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.
Even concreet: ik werk met php7.
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 ë.



<?php
$string = "Tëst";

for($i=0;$i<mb_strlen($string);$i++) {

   $str = mb_substr($string, $i,1);
   echo  preg_replace_callback(
              '/[^A-Za-z!-%\x27-;=?-~ ]/u',
              function($matches) {
                  $chnr =  mb_ord($matches[0]);
                  $out = '\\u'.$chnr . '\\\''. dechex($chnr);

                  return $out;
              },
              $str);
}

echo PHP_EOL;
?>


[size=xsmall]Toevoeging op 06/04/2018 14:22:03:[/size]

dit levert
T\u235\'ebst


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
Ik zie wat er fout gaat. Op het moment van opslaan gebeurt er dit met de tekst:

$content = mysqli_real_escape_string($conn, $_POST['content']);


Daardoor komt er &euml; in de database te staan in plaats van een e met puntjes.


Dat lijkt mij niet, nee. De enige redenen die ik kan bedenken dat &euml; in je database terecht komt zijn:
- iemand heeft letterlijk "&euml;" 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.
Het lag eraan dat het tekstveld werkte met een wysiwyg editor. Daardoor kwam de e met trema anders in de database. Dat is nu opgelost.

Zoek alleen nog de omzetting naar rtf-code via PHP....

Reageren