PHP:mb_strtoupper无法正常工作

时间:2013-02-24 11:28:35

标签: php utf-8 mbstring

我遇到UTF-8和mb_strtoupper问题。

mb_internal_encoding('UTF-8');
$guesstitlestring='Le Courrier de Sáint-Hyácinthe';

$encoding=mb_detect_encoding($guesstitlestring);
if ($encoding!=='UTF-8') $guesstitlestring=mb_convert_encoding($guesstitlestring,'UTF-8',$encoding);

echo "DEBUG1 $guesstitlestring\n";
$guesstitlestring=mb_strtoupper($guesstitlestring);
echo "DEBUG2 $guesstitlestring\n";

结果:

DEBUG1 Le Courrier de Sáint-Hyácinthe
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE

我不明白为什么会这样?我正在尝试尽可能小心地使用编码。该字符串首先作为UTF-8给出,经过验证并可能重新转换为UTF-8。这是一场噩梦!

更新

所以我发现这是由于我通过控制台输入参数和从控制台返回的参数的组合引起的。所以他们在前进和出路的路上都是乱码。解决方案是不以这种方式输入任何参数,或以这种方式获取参数。

感谢大家帮忙解决这个问题!

4 个答案:

答案 0 :(得分:5)

而不是strtoupper()/mb_strtoupper()使用mb_convert_case(),因为大写转换在不同的编码中非常棘手,所以也要确保你的字符串是UTF-8。

$content = 'Le Courrier de Sáint-Hyácinthe';

mb_internal_encoding('UTF-8');
if(!mb_check_encoding($content, 'UTF-8')
    OR !($content === mb_convert_encoding(mb_convert_encoding($content, 'UTF-32', 'UTF-8' ), 'UTF-8', 'UTF-32'))) {

    $content = mb_convert_encoding($content, 'UTF-8'); 
}

// LE COURRIER DE SÁINT-HYÁCINTHE
echo mb_convert_case($content, MB_CASE_UPPER, "UTF-8"); 

工作示例:http://3v4l.org/enEfm#v443

另见我在PHP网站上关于转换器的评论:http://www.php.net/manual/function.utf8-encode.php#102382

答案 1 :(得分:2)

它适用于我,但只有当php文件本身保存为UTF-8并且我所在的终端需要UTF-8时。我想你发生的事情是文件保存为ISO-8859-1,你的终端期待ISO-8859-1。

首先,mb_detect_encoding 对此字符串实际上不起作用。即使PHP文件不是UTF-8,它仍然会将其报告为UTF-8。

当您打印小写字符串时,它会打印ISO-8859-1字符,您的终端显示它们就好了。然后当你使用UTF-8转换为大写时,它会被破坏。

我创建了这个文件的两个版本。我使用ISO-8859-1中的文本编辑器将其保存为iso-8859-1.php。然后我使用iconv将整个文件转换为UTF-8并将其保存为utf-8.php

iconv iso-8859-1.php --from iso-8859-1 --to UTF-8 > utf-8.php

我添加了一行来打印结果mb_detect_encoding返回的编码。

$ file iso-8859-1.php 
iso-8859-1.php: PHP script, ISO-8859 text

$ php iso-8859-1.php 
ENCODING: UTF-8
DEBUG1 Le Courrier de S�int-Hy�cinthe
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE

$ file utf-8.php 
utf-8.php: PHP script, UTF-8 Unicode text

$ php utf-8.php 
ENCODING: UTF-8
DEBUG1 Le Courrier de Sáint-Hyácinthe
DEBUG2 LE COURRIER DE SÁINT-HYÁCINTHE

我的终端实际上​​需要UTF-8文本,因此当我打印出ISO-8859-1文本时,它会被破坏。当文件保存为utf-8且终端需要utf-8时,一切正常。

答案 2 :(得分:2)

实际上,这里有用的只是

<?php
mb_internal_encoding('UTF-8');

$x='Le Courrier de Sáint-Hyácinthe';
echo mb_strtoupper( $x ) . "\n";

输出

LE COURRIER DE SÁINT-HYÁCINTHE

这里可以直接使用,但也许在你的情况下你必须添加utf8_encode

$x = utf8_encode( 'Le Courrier de Sáint-Hyácinthe' );

-

这里没有MB的替代方案,

<?php
echo strtoupper(str_replace('á', 'Á', 'Le Courrier de Sáint-Hyácinthe'));

答案 3 :(得分:0)

只需使用 mb_convert_case

get