我对 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";
Result:
DEBUG1 Le Courrier de Sáint-Hyácinthe
DEBUG2 LE COURRIER DE S?INT-HY?CINTHE
我不明白为什么会发生这种情况?我正在尝试尽可能小心地处理编码。该字符串首先以 UTF-8 形式给出,经过验证并可能重新转换为 UTF-8。这是一场噩梦!
UPDATE
所以我发现这是由我通过控制台输入参数和从控制台返回的参数共同引起的。所以他们在进来和出去的时候都是乱码。解决方案是不要以这种方式输入任何参数,或以这种方式取出参数。
感谢大家帮助解决这个问题!
代替strtoupper()/mb_strtoupper()
use 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 http://3v4l.org/enEfm#v443
另请参阅我在 PHP 网站上关于转换器的评论:http://www.php.net/manual/function.utf8-encode.php#102382 http://www.php.net/manual/function.utf8-encode.php#102382
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)