1. ホーム
  2. php

[解決済み] PHP の文字列からアクセント記号を取り除くにはどうしたらよいですか?

2022-11-04 17:31:26

質問

PHPの文字列をURLで使用できるようにするための最初のステップとして、文字からアクセント記号を除去しようとしています。

私は以下のコードを使用しています。

$input = "Fóø Bår";

setlocale(LC_ALL, "en_US.utf8");
$output = iconv("utf-8", "ascii//TRANSLIT", $input);

print($output);

期待する出力は次のようなものです。

F'oo Bar

ただし、アクセント記号は音訳されるのではなく、クエスチョンマークに置き換わります。

F?? B?r

ネットで調べたところ、ロケールを設定すればこの問題が解決するようですが、私はすでにこれを実行しています。 私は以下の詳細を確認済みです。

  1. 私が設定しているロケールはサーバーでサポートされています (以下の方法で生成されたリストに含まれています。 locale -a )
  2. ソースとターゲットのエンコーディング (UTF-8 と ASCII) は、サーバーのバージョンの iconv でサポートされています (このリストは iconv -l )
  3. 入力文字列は UTF-8 でエンコードされています (PHP の mb_check_encoding 関数で検証されています。 mercatorの回答 )
  4. の呼び出しは setlocale の呼び出しが成功した場合 (これは 'en_US.utf8' ではなく FALSE )

問題の原因

サーバーが iconv の間違った実装を使用しています。 これには glibc バージョンではなく、必要な libiconv バージョンに変更してください。

システムによってはiconv関数が期待通りに動作しないことがあることに注意してください。そのような場合は、GNU libiconv ライブラリをインストールするのがよいでしょう。その方が、より一貫した結果を得られる可能性が高いです。

- PHPマニュアルのiconvの紹介

PHP で使用される iconv の実装についての詳細は phpinfo 関数の出力に含まれます。

(私はこのプロジェクトのために働いているサーバーで正しいiconvライブラリでPHPを再コンパイルすることができないので、私が以下で受け入れた答えはiconvサポートなしでアクセントを取り除くために最も有用だったものです)。

どのように解決するのですか?

この問題は、あなたのエンコーディングが ä と å を 'a' とは異なるシンボルとみなしていることだと思います。実際、PHPのstrtrのドキュメントには、醜い方法でアクセントを除去するサンプルがあります :(

http://ie2.php.net/strtr