6

我对 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

4 回答 4

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

于 2013-02-24T11:45:16.930 回答
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 时,一切正常。

于 2013-02-24T11:52:52.413 回答
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'));
于 2013-02-24T12:05:04.203 回答
0

只需使用 mb_convert_case

//$content = 'Le Courrier de Sáint-Hyácinthe';
$content = 'رسومات رغد';
echo mb_convert_case($content, MB_CASE_UPPER, "UTF-8");
于 2021-05-21T12:25:39.153 回答