35

I have some text in a non-English/foreign language in my page, but when I try to make it lowercase, it characters are converted into black diamonds containing question marks.

$a = "Երկիր Ավելացնել";
echo $b = strtolower($a);
//returns  ����� ���������

I've set my charset in a metatag, but this didn't fix it.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

What can I do to convert my string to lowercase without corrupting it?

mickmackusa
  • 43,625
  • 12
  • 83
  • 136
Simon
  • 22,637
  • 36
  • 92
  • 121

8 Answers8

77

Have you tried using mb_strtolower()?

Dharman
  • 30,962
  • 25
  • 85
  • 135
SteelBytes
  • 6,905
  • 1
  • 26
  • 28
  • 8
    var_dump(mb_strtolower('ԱԱԱ', mb_detect_encoding('ԱԱԱ'))); // string(6) "աաա" 100% Working!!!! –  Feb 21 '14 at 12:41
22

PHP5 is not UTF-8 compatible, so you still need to resort to the mb extension. I suggest you set the internal encoding of mb to utf-8 and then you can freely use its functions without specifying the charset all the time:

mb_internal_encoding('UTF-8');

...

$b = mb_strtolower($a);
echo $b;
reko_t
  • 55,302
  • 10
  • 87
  • 77
10

i have found this solution from here

$string = 'Թ';
echo 'Uppercase: '.mb_convert_case($string, MB_CASE_UPPER, "UTF-8").'';
echo 'Lowercase: '.mb_convert_case($string, MB_CASE_LOWER, "UTF-8").'';
echo 'Original: '.$string.'';

works for me (lower case)

khaled_webdev
  • 1,420
  • 15
  • 20
5

Have you tried mb_strtolower() and specifying the encoding as the second parameter?

The examples on that page appear to work.

You could also try:

$str = mb_strtolower($str, mb_detect_encoding($str));
Dharman
  • 30,962
  • 25
  • 85
  • 135
Kevin
  • 13,153
  • 11
  • 60
  • 87
3

Php by default does not know about utf-8. It assumes any string is ASCII, so it strtolower converts bytes containing codes of uppercase letters A-Z to codes of lowercase a-z. As the UTF-8 non-ascii letters are written with two or more bytes, the strtolower converts each byte separately, and if the byte happens to contain code equal to letters A-Z, it is converted. In the result the sequence is broken, and it no longer represents correct character.

To change this you need to configure the mbstring extension:

http://www.php.net/manual/en/book.mbstring.php

to replace strtolower with mb_strtolower or use mb_strtolower direclty. I any case, you need to spend some time to configure the mbstring settings to match your requirements.

SWilk
  • 3,261
  • 8
  • 30
  • 51
2

Use mb_strtolower instead, as strtolower doesn't work on multi-byte characters.

Powerlord
  • 87,612
  • 17
  • 125
  • 175
  • `strtolower` does actually work on multibyte characters, it just works off of the current locale, which is not usually what you want in these cases. – Nick Bastin Mar 25 '10 at 14:51
1

strtolower() will perform the conversion in the currently selected locale only.

I would try mb_convert_case(). Make sure you explicitly specify an encoding.

Pekka
  • 442,112
  • 142
  • 972
  • 1,088
0

You will need to set the locale; see the first example at http://ca3.php.net/manual/en/function.strtolower.php

intuited
  • 23,174
  • 7
  • 66
  • 88