mb_strtolower and utf8 strings

As you know, we need to use mb_strtolower() instead of strtolower() while we're working with utf-8 data:

$str = 'برنامه';
echo strtolower($str);
----------------------
output: �����

It's all gone to undefined chars, now I use mb_strtolower()

$str = 'برنامه';
echo mb_strtolower($str);
----------------------
output: �����

still the same results, now:

$str = 'برنامه';
echo mb_strtolower($str,  mb_detect_encoding($str));
----------------------
output: برنامه

Now it's fixed, so the way to use mb_strtolower is to also having mb_detect_encoding.

Now my problem is that I want to do the same thing with array_map:

$results_array = array_map('mb_strtolower', $results_array);

How I'm supposed to use mb_detect_encoding with the above line?

Answers


The solution is to tell mb_strtolower what your string encoding is:

echo mb_strtolower($str, 'UTF-8');

If you don't want to supply this parameter every time, set it once for all mb_ functions:

mb_internal_encoding('UTF-8');

Then you can call any mb_ function and it will handle your string as UTF-8:

echo mb_strtolower($str); // works without second parameter now

mb_detect_encoding happens to return 'UTF-8' because it detected it, but it is generally unreliable, since it's conceptually impossible to reliably detect arbitrarily encoded strings. Know what your strings are encoded in and pass this information explicitly.


Simply put, define your own function which then calls mb_strtolower with mb_detect_encoding.

$results_array = array_map(function($var) {
      return mb_strtolower($var, mb_detect_encoding($var));
}, $results_array);

Need Your Help

Set a specific bit in an int

c# bit-manipulation

I need to mask certain string values read from a database by setting a specific bit in an int value for each possible database value. For example, if the database returns the string "value1" then ...

How to setup Clion for compile and RUN

gcc g++ clion jetbrains-ide

I just download Clion from https://www.jetbrains.com/ because I just love rest of their products.