web-dev-qa-db-ja.com

PHP:iconvで特殊文字を扱う

iconvがどのように機能するのかまだわかりません。

例えば、

_$string = "Löic & René";
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
_

ええ、

Notice:iconv()[function.iconv]:入力文字列で不正な文字を検出しました...

_$string = "Löic";_または_$string = "René";_

ええ、

注意:iconv() [function.iconv]:は、入力文字列inで不完全なマルチバイト文字を検出しました。

_$string = "&";_で何も得られない

データベースのテーブル内の2つの異なる列に保存する必要がある2つの異なる出力セットがあります。

  1. URLをきれいにするために_Löic & René_を_Loic & Rene_に変換する必要があります。

  2. それらをそのまま保持する必要があります-_Löic & René_を_Löic & René_として、HTMLページに表示するときにhtmlentities($string, ENT_QUOTES);でのみ変換します。

php.net 以下の提案をいくつか試してみましたが、まだ動作しません。

音訳された一部の文字が必要な状況がありましたが、他の文字は無視されました(aynやhamzaなどの奇妙な発音区別符号のため)。 // TRANSLIT // IGNOREを追加することは、私にとってはうまくいくように思えました。音訳できるすべてのものを音訳しますが、できないものは捨てます。

そう:

_$string = "ʿABBĀSĀBĀD";

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $string);
// output: [nothing, and you get a notice]

echo iconv('UTF-8', 'ISO-8859-1//IGNORE', $string);
// output: ABBSBD

echo iconv('UTF-8', 'ISO-8859-1//TRANSLIT//IGNORE', $string);
// output: ABBASABAD
// Yay! That's what I wanted!
_

そしてもう一つ、

_Andries Seutens 07-Nov-2009 07:38
When doing transliteration, you have to make sure that your LC_COLLATE is properly set, otherwise the default POSIX will be used.

To transform "rené" into "rene" we could use the following code snippet:
setlocale(LC_CTYPE, 'nl_BE.utf8');

$string = 'rené';
$string = iconv('UTF-8', 'ASCII//TRANSLIT', $string);

echo $string; // outputs rene
_

実際にそれらをどのように解決できますか?

ありがとう。

編集:

これは、コードをテストするソースファイルです。

_<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<?php
$string = "Löic & René";
$output = iconv("UTF-8", "ISO-8859-1//TRANSLIT", $string); 
?>
</html>
_
27
laukok

また、ソースファイルをUTF-8エンコードで保存しましたか?そうでない場合(そして、それが「不完全なマルチバイト文字」エラーを生成するので、そうしなかったと思います)、最初にそれを試してください。

14
wimvds
$clean = iconv('UTF-8', 'ASCII//TRANSLIT', utf8_encode($s));
21
Riccardo