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()使用する代わりに、文字列が UTF-8 であることも確認してください。mb_convert_case()

$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 Web サイトでの私のコメントも参照してください: http://www.php.net/manual/function.utf8-encode.php#102382

于 2013-02-24T11:45:16.930 に答える
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 に答える
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 を使用して大文字に変換すると、文字化けします。

このファイルの 2 つのバージョンを作成しました。テキスト エディタを使用して 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 に答える