{"id":760,"date":"2014-01-31T15:10:28","date_gmt":"2014-01-31T13:10:28","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=760"},"modified":"2014-01-31T15:10:28","modified_gmt":"2014-01-31T13:10:28","slug":"php-strlen-vs-mb_strlen","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/","title":{"rendered":"PHP : strlen vs mb_strlen"},"content":{"rendered":"<h1>De l&rsquo;utilisation d\u00e9voy\u00e9e de strlen<\/h1>\n<p>Une erreur commun\u00e9ment faite par nombre de d\u00e9veloppeurs PHP consiste \u00e0 se servir de <strong>strlen<\/strong> pour mesurer la longueur d&rsquo;une cha\u00eene de caract\u00e8res. Mais gare ! Car, m\u00eame si la documentation PHP est quelque peu ambigu\u00eb \u00e0 ce sujet, il est toutefois fait mention du fait suivant :<\/p>\n<blockquote><p>strlen() retourne le nombres d&rsquo;octets plut\u00f4t que le nombre de caract\u00e8res dans une cha\u00eene.<\/p><\/blockquote>\n<p>Pour des cha\u00eenes de caract\u00e8res ASCII (cod\u00e9es sur un octet &#8211; 7 bits, en r\u00e9alit\u00e9), pas de probl\u00e8mes particulier, comme vous le constatez :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-761\" alt=\"strlen\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7.jpeg\" width=\"320\" height=\"133\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7.jpeg 320w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7-300x124.jpeg 300w\" sizes=\"(max-width: 320px) 100vw, 320px\" \/><\/a><\/p>\n<p>Attention toutefois, les espaces sont aussi des caract\u00e8res ! Vous pouvez appliquer <strong>trim<\/strong> au besoin pour \u00e9laguer les espaces (avant et apr\u00e8s, pas au milieu de votre ch\u00e2ine de caract\u00e8res !)<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/71.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-762\" alt=\"strlen-espace\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/71.jpeg\" width=\"247\" height=\"109\" \/><\/a><br \/>\n<div id=\"attachment_774\" style=\"width: 363px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/Longueur_Ruban.jpg\"><img aria-describedby=\"caption-attachment-774\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/Longueur_Ruban.jpg\" alt=\"Photo d&#039;un ruban \u00e0 mesurer\" width=\"353\" height=\"228\" class=\"size-full wp-image-774\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/Longueur_Ruban.jpg 353w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/Longueur_Ruban-300x193.jpg 300w\" sizes=\"(max-width: 353px) 100vw, 353px\" \/><\/a><p id=\"caption-attachment-774\" class=\"wp-caption-text\">La taille, \u00e7a compte !<\/p><\/div><br \/>\nL\u00e0 o\u00f9 les choses se corsent quelque peu, c&rsquo;est lorsque votre cha\u00eene de caract\u00e8res est susceptible de contenir des caract\u00e8res cod\u00e9s sur plus d&rsquo;un octet&#8230;<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/72.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-763\" alt=\"strlen-utf8\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/72.jpeg\" width=\"244\" height=\"90\" \/><\/a><\/p>\n<p>La fonction <strong>strlen<\/strong> me renvoie 10&#8230;elle ne compte pas les caract\u00e8res (il y en a 9 !) mais les octets n\u00e9cessaires pour repr\u00e9senter notre cha\u00eene de caract\u00e8res ! Attention donc aux \u00e9tourdis qui pensent compter le nombre de caract\u00e8res, vous faites fausse route ! Mon caract\u00e8re accentu\u00e9 compte pour deux, mais deux octets&#8230;et non deux caract\u00e8res !<\/p>\n<h1>mb_strlen \u00e0 la rescousse !<\/h1>\n<p>Avant de voir ce que donnerait <b>mb_strlen<\/b> appliqu\u00e9e \u00e0 notre exemple, t\u00e2chons de voir quel codage de caract\u00e8res nous avons par d\u00e9faut :<br \/>\n<a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/73.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-766\" alt=\"strlen-internal-encoding\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/73.jpeg\" width=\"305\" height=\"59\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/73.jpeg 305w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/73-300x58.jpeg 300w\" sizes=\"(max-width: 305px) 100vw, 305px\" \/><\/a><\/p>\n<p>Par d\u00e9faut, notre jeu de caract\u00e8res est donc <b>latin1<\/b>. Si nous utilisons <b>mb_strlen<\/b> sans pr\u00e9ciser le jeu de caract\u00e8res que nous ciblons, le r\u00e9sultat sera le m\u00eame qu&rsquo;en utilisant <b>strlen<\/b>, et \u00e7a, nous n&rsquo;en voulons pas.<\/p>\n<p>Voyons quel est le jeu de caract\u00e8res de notre cha\u00eene, m\u00eame si nous nous en doutons un peu ! \ud83d\ude09<br \/>\n<a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/74.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-767\" alt=\"7\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/74.jpeg\" width=\"339\" height=\"75\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/74.jpeg 339w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/74-300x66.jpeg 300w\" sizes=\"(max-width: 339px) 100vw, 339px\" \/><\/a><\/p>\n<p>Nous y voil\u00e0 donc ! Notre cha\u00eene est cod\u00e9e en UTF-8. Cette information est capitale si nous souhaitons utiliser <b>mb_strlen<\/b> correctement. Voici donc l&rsquo;appel \u00e0 cette fonction tel qu&rsquo;il doit \u00eatre fait pour fonctionner :<\/p>\n<p><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/76.jpeg\"><img loading=\"lazy\" class=\"alignnone size-full wp-image-769\" alt=\"7\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/76.jpeg\" width=\"341\" height=\"59\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/76.jpeg 341w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/76-300x51.jpeg 300w\" sizes=\"(max-width: 341px) 100vw, 341px\" \/><\/a><\/p>\n<p>La fonction <b>mb_strlen<\/b> nous renvoie bien 9, qui est bien le nombre de caract\u00e8res de notre cha\u00eene !<\/p>\n<p>Attention, le type de retour de mb_strlen est <b>mixed<\/b>, ce qui signifie que la fonction renvoie plusieurs types :<\/p>\n<ul>\n<li>Dans le cas o\u00f9 elle s&rsquo;ex\u00e9cute correctement, elle renvoie bien le nombre de caract\u00e8res selon le codage que vous avez choisi (ou celui par d\u00e9faut)<\/li>\n<li>Dans le cas o\u00f9 elle \u00e9choue, elle renvoie le bool\u00e9en false<\/li>\n<\/ul>\n<p>Faites donc attention \u00e0 utiliser la triple \u00e9galit\u00e9 (en valeur et en nombre). Si vous passez un codage invalide, la fonction vous renverra false et un <b>Warning<\/b>. Attention cependant pour les petits malins qui abusent du @ pour cacher les erreurs sous le tapis :<br \/>\n+<a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/75.jpeg\"><img loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/75.jpeg\" alt=\"strlen-badencoding\" width=\"355\" height=\"121\" class=\"alignnone size-full wp-image-772\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/75.jpeg 355w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/75-300x102.jpeg 300w\" sizes=\"(max-width: 355px) 100vw, 355px\" \/><\/a><\/p>\n<p>Que votre cha\u00eene soit vide ou que vous mentionniez un codage invalide, avec une \u00e9galit\u00e9 simple (non stricte), le r\u00e9sultat sera le m\u00eame.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>De l&rsquo;utilisation d\u00e9voy\u00e9e de strlen Une erreur commun\u00e9ment faite par nombre de d\u00e9veloppeurs PHP consiste \u00e0 se servir de strlen pour mesurer la longueur d&rsquo;une cha\u00eene de caract\u00e8res. Mais gare ! Car, m\u00eame si la documentation PHP est quelque peu ambigu\u00eb \u00e0 ce sujet, il est toutefois fait mention du fait suivant : strlen() retourne [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[40,3],"tags":[70,69,71],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog<\/title>\n<meta name=\"description\" content=\"Pour en finir avec la mauvaise utilisation de strlen en PHP.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Pour en finir avec la mauvaise utilisation de strlen en PHP.\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-01-31T13:10:28+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7.jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/\",\"name\":\"PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2014-01-31T13:10:28+00:00\",\"dateModified\":\"2014-01-31T13:10:28+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"description\":\"Pour en finir avec la mauvaise utilisation de strlen en PHP.\",\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PHP : strlen vs mb_strlen\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog","description":"Pour en finir avec la mauvaise utilisation de strlen en PHP.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/","og_locale":"fr_FR","og_type":"article","og_title":"PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog","og_description":"Pour en finir avec la mauvaise utilisation de strlen en PHP.","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2014-01-31T13:10:28+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/01\/7.jpeg"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/","name":"PHP : strlen vs mb_strlen - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2014-01-31T13:10:28+00:00","dateModified":"2014-01-31T13:10:28+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"description":"Pour en finir avec la mauvaise utilisation de strlen en PHP.","breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/01\/php-strlen-vs-mb_strlen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"PHP : strlen vs mb_strlen"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/760"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=760"}],"version-history":[{"count":6,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/760\/revisions"}],"predecessor-version":[{"id":775,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/760\/revisions\/775"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=760"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=760"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=760"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}