3

一部の から分音符号を削除するのに苦労してい$stringます。私のコードは

<?php
$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";
$without_diacritics = strTr($string, "říšžťčýůúěďó", "risztcyuuedo");
echo $without_diacritics; 

一方、期待される出力はPrilis zlutoucky kun upel dabelske ody.

代わりに、非常に奇妙な応答を受け取ります。

Puiszliuc uuluueoudoks� ku�u� s�pd�l d�scbelsks� s�dy.

マルチバイト文字に問題がある可能性があると考えていましたが、マルチバイト文字はstrtr安全であることがわかりました。私の仮定は間違っていますか?私は何が欠けていますか?

4

2 に答える 2

4

問題は、入力翻訳文字列が出力翻訳文字列の 2 倍の大きさ (Unicode のため) でありstrtr()、文字ではなくバイトで動作することです。この場合、変換配列の方が適しています。

$string = "Příliš žluťoučký kůň úpěl ďábelské ódy.";

echo strtr($string, [
  'ř' => 'r',
  'í' => 'i',
  'š' => 's',
  'ž' => 'z',
  'ť' => 't',
  'č' => 'c',
  'ý' => 'y',
  'ů' => 'u',
  'ú' => 'u',
  'ě' => 'e',
  'ď' => 'd',
  'ó' => 'o'
]);

出力:

Prilis zlutoucky kuň upel dábelské ody.

デモ

于 2015-02-05T00:58:29.943 に答える
1

シンプルで試行錯誤されたソリューション(この回答iconv()に基づく)は、文字列を「指定されたエンコーディングからASCII文字に」変換するためにハーネスを使用します。

$input = 'Příliš žluťoučký kůň úpěl ďábelské ódy.';
$input = iconv('UTF-8', 'ASCII//TRANSLIT', $input);
echo $input;

Example


説明

あなたが直面している問題は、文字列/ドキュメントのエンコードが原因です。strtr()@ChrisForrence が彼のコメントで述べたように、問題はマルチバイトに対応していないことです。

これらの文字の一部が複数バイトであるため、適切にマップされていない可能性があります。

于 2015-02-05T00:24:07.900 に答える