9

この単純なコードを考えてみましょう。

echo iconv('UTF-8', 'ASCII//TRANSLIT', 'è');

印刷します

 `e

ただの代わりに

 e

私が間違っていることを知っていますか?


setlocaleを追加しても何も変わりません

setlocale(LC_COLLATE, 'en_US.utf8');
echo iconv('UTF-8', 'ASCII//TRANSLIT', 'è');
4

7 に答える 7

10

無効な URL 文字なしで有効な URL 文字列を返すこの標準関数があります。魔法は、//不要な文字を削除するコメントの後の行にあるようです。

これは Symfony フレームワークのドキュメント ( http://www.symfony-project.org/jobeet/1_4/Doctrine/en/08 ) から取得したもので、これはhttp://php.vrana.cz/vytvoreni-pratelskeho-から取得したものです。 url.php でもチェコ語は話せません ;-)

function slugify($text)
{
  // replace non letter or digits by -
  $text = preg_replace('#[^\\pL\d]+#u', '-', $text);

  // trim
  $text = trim($text, '-');

  // transliterate
  if (function_exists('iconv'))
  {
    $text = iconv('utf-8', 'us-ascii//TRANSLIT', $text);
  }

  // lowercase
  $text = strtolower($text);

  // remove unwanted characters
  $text = preg_replace('#[^-\w]+#', '', $text);

  if (empty($text))
  {
    return 'n-a';
  }

  return $text;
}

echo slugify('é'); // --> "e"
于 2011-02-06T00:32:58.637 に答える
8

cf @tchrist、INTL php 拡張子付き

http://fr2.php.net/manual/en/book.intl.php

preg_replace('/\pM*/u','',normalizer_normalize( $mystring, Normalizer::FORM_D));

eéèêëiîïoöôuùûüaâäÅ Ἥ ŐǟǠ ǺƶƈƉųŪŧȬƀ␢ĦŁȽŦ ƀǖは次のようになります。

eeeeeiiiooouuuaaaA Η OaA AƶƈƉuUŧOƀ␢ĦŁȽŦ ƀu


tchrist が強調しているように、すべての Unicode 文字が分解可能と見なされるわけではありません。

Unicode チャートから抽出:

U0080.pdf

00CF Ï ローマ字大文字 I 分音記号付き

≡ 0049 I 0308 ¨

注意: この記号 « ≡ » は利用可能な分解を示します

00D0 Ð ラテン大文字 ETH

→ 00F0 ð ラテン小文字 eth

→ 0110 Đ ストローク付きラテン大文字 d

→ 0189 Ɖ ラテン大文字アフリカン d

利用可能な分解はありません。奇妙に私見です(ASCII文字Dを許容可能な同等物と見なすことができます)。

U0100.pdf

0110 Đ ローマ字大文字 D ストローク付き

→ 00D0 Ð ラテン大文字 eth

→ 0111 đ ストローク付きラテン小文字 d

→ 0189 Ɖ ラテン大文字アフリカン d

さらに奇妙なことに、これは LATIN CAPITAL LETTER D (ストローク付き) として識別されますが、そのままでは分解できません! おそらく、よりクールな解決策は、各文字のユニコード記述を取得し、それを各ASCII文字の記述と比較することです(それに応じて置き換えます)。誰?;-]

参照http://unicode.org/Public/UNIDATA/UnicodeData.txt

于 2012-08-08T15:28:01.737 に答える
2

PHPなしの純粋なiconvで私に起こります。トリックは、LANG 環境値を en_US.UTF-8 に設定することでした (私の場合、以前は hu_HU.UTF-8 でした)。期待どおりに機能した後。

于 2013-07-01T13:22:04.267 に答える
0

文字変換を行うときは、LC_COLLATEが適切に設定されていることを確認する必要があります。そうでない場合、デフォルトのPOSIXが使用されます。

http://uk3.php.net/manual/en/function.setlocale.phpを見てください

于 2011-02-06T00:22:34.107 に答える
0

これは私の専門外であるが、私は「何もない」と言いたくなる。PHP の iconv() は悪名高く、次のような多くの回避策のインスピレーションとなっています。

  • システムの iconv ユーティリティにドロップ (Unix & Linux)
  • ルックアップ テーブルの作成
  • 一種の前処理段階として、すべてのアクセント付き文字を同等の ASCII 文字に置き換える
  • LC_COLLATE の設定 (すべての人に有効とは思えません)
  • iconv() の代わりに htmlentities() を使用する

さらにインスピレーションを得るには、 iconv() ドキュメントのコメントをお読みください。(または同情。コールするには近すぎます。)

于 2011-02-06T00:50:46.123 に答える
0

これを処理する標準的な方法は、「アクセントの削除」機能を使用することです。これは、フラリッシュのようなライブラリや Wordpress のような CMS で見つけることできます。これは URL スラッグ以外には良い考えではないため、Iconv はアクセントを変換できないようです (当然のことながら)。

于 2011-10-28T15:18:10.930 に答える
-1

phpのバージョンに依存するようです...


テストケース #1

php -version

PHP 7.0.0RC8 (cli) (ビルド: 2015 年 11 月 25 日 12:36:50) ( NTS ) Copyright (c) 1997-2015 The PHP Group Zend Engine v3.0.0、Copyright (c) 1998-2015 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies

php -r "var_dump(iconv('UTF-8', 'ASCII//TRANSLIT', 'è'));"

string(2) "`e"

テストケース #2

php -version

PHP 7.0.8-1~dotdeb+8.1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.8-1~ dotdeb+8.1, Copyright (c) 1999-2016, by Zend Technologies

php -r "var_dump(iconv('UTF-8', 'ASCII//TRANSLIT', 'è'));"

string(1) "e"
于 2016-08-01T22:44:15.160 に答える