MS-Word controlcharacters in de titels



Mensen zijn nu eenmaal verslaafd aan MS-Word, en het zal wel nooit zover komen dat iedereen snapt dat je niet alles naar alles kan knippen en plakken.
Zelfs de makers van Windows lijken maar niet te kunnen begrijpen dat er ook nog een wereld bestaat die niet met MS- begint.
En zo komen er dus MS controlcharacters in titels terecht. Terwijl de rest van de wereld op internet UTF-8 gebruikt voor biijzondere tekens, gebruikt Microsoft zijn eigen codes. De Volkskrant zou die codes er uit moeten filteren, want het zijn geen leesbare letters, maar dat doen ze niet. De onleesbare tekens worden gewoon HTML-gecodeerd meeverstuurd in de URL en in de titel wordt het een “?”

Waarom heb ik daar last van ?
Omdat ik het lijstje met URL’s vergelijk met de titels die de importer al heeft. De importer is inmiddels zo slim om ook de URL’s te bewaren, maar het controleren daarvan kost weer een databasetoegang, dus hij kijkt eerst of hij de titel
( bij een reisblog ) of de timestamp ( bij een gewoon blog ) al heeft, en daarna pas of de bewaarde URL overeenkomt.
Een titel hoeft namelijk niet uniek te zijn, een timestamp ook niet. ( vooral niet bij VKblog )
En daardoor stak er dus weer een nieuwe bug de kop op.
De importer probeert uit de URL een titel te destilleren, d.m.v. de PHP functie rawurldecode.
Dat is de functie die %20 in de URL vertaalt in spatie in titel.
En dat rare tekenje van %C2%96 naar…. C296
Een “raar teken” afkomstig van MS-Word met code C296 wordt door de PHP functie htmlentities niet herkend, dus het blijven 2 bytes, terwijl in de titel op de plek van het “rare teken” een vraagteken staat. Gevolg : geen match, een bericht met deze titel heb ik nog niet, haal maar binnen, en we hebben weer een klusje voor de beheerder, want er zitten weer x-100 dubbele berichten in de database.
Overigens is de query die de titels ophaalt wel zo slim dat hij alleen naar de tekst kijkt, want omdat een spatie in een URL niet toegestaan is, wordt die niet alleen vervangen door %20, maar soms ook door een _ En dan zijn er nog streepjes, punten, comma’s, aanhalingstekens,… die kandidaat zijn voor vervanging.
Je hebt alleen wat aan letters en cijfers.
Daarom vervang ik alles wat geen letter of cijfer is door _
De underscore heeft in MySQL in een querystring de functie van joker.

$qTitle = preg_replace( '/\xC2./', ' ', $qTitle);
$qTitle = preg_replace('/\W/','_', $qTitle);
$wpdb->get_col( $wpdb->prepare("SELECT ID FROM $wpdb->posts
WHERE post_title like %s AND post_status = 'publish' and 
post_author = %d" , $qTitle, $qUser));

Klaar !

Ik stuur de beheerder even een mailtje om de troep op te ruimen.
( O shit, dat ben ik zelf )

 

Het argument in de preg_replace functie is een regular expression
Regular expressions zijn een programmeertaal op zich met veel
krachtigere stringmanipulatie functies dan PHP zelf heeft.
Regex is dus een taal binnen een taal, zoals SQL dat ook is.
Regular expressions kunnen soms ook gebruikt worden in de
zoek/vervang functie van tekstverwerkers.
Read Offline:
This entry was posted in Wordpress and tagged , , , . Bookmark the permalink.

4 Responses to MS-Word controlcharacters in de titels

  1. Die arme beheerder….;-)

  2. Maria Trepp says:

    ah interessant al snap ik niet elk detail.
    Maar ik snap dat MS word rare tekens geeft en dus problemen veroorzaakt.

    en weer eens dank voor alle inspanning!

  3. admin says:

    Het idee is, dat je bij knippen en plakken altijd moet bedenken of de bron en de ontvanger wel dezelfde taal spreken. Zoniet, dan heb je een tussenstation nodig dat een taal spreekt die iedereen verstaat. Zo’n tussenstation kan “kladblok” zijn.

    Een bij mij beruchte plakker is VKblogger Hyperinflatie. Die plakt hele websites met HTML en al in een blogje bij de Volkskrant. Ik heb er laatst nog code voor moeten aanpassen, want de importer bleef hangen op de HTML van een of andere Duitse website waar hij alles van kopieert.

Leave a Reply

Your email address will not be published.