2

Ajax 呼び出しを使用して、ヘブライ語で応答を受け取ります。結果は別のサイトから取得され、windows-1255エンコードされます。私のページはUTF-8です。応答は次のようになります。

îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú  àéï 

私はこのウェブサイトを見つけました: http://kanjidict.stc.cx/recode.php Windows-1255 から UTF-8 を使用し (+最後のチェックボックスをマーク)、結果は完璧です。質問は、PHPでそれを行うにはどうすればよいですか?

私がすることはすべてゴミになります。

$data = 'îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ';
echo mb_detect_encoding($data);

結果はUTF-8(私のphpファイルがutf-8であるため、実際にはUTF-8である可能性があります)

私は実際にこの結果が必要です:

מידע למקבל  בזק החברה הישראלית אין 

私がiconvを試してみると:

echo iconv("WINDOWS-1255", "UTF-8", "îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ");

私はこれを得る:

ֳ®ֳ©ֳ£ֳ² ֳ¬ֳ®ֳ·ֳ¡ֳ¬ ֳ¡ֳ¦ֳ· ֳ₪ֳ§ֳ¡ֳ¸ֳ₪ ֳ₪ֳ©ֳ¹ֳ¸ֳ ֳ¬ֳ©ֳ÷ ֳ ֳ©ֳ¯ 

何が起こっている?ヘブライ語の結果を取得するにはどうすればよいですか?

ありがとう!!

4

2 に答える 2

2

この内容のファイルがある場合:

echo iconv("WINDOWS-1255", "UTF-8", "îéãò ìî÷áì  áæ÷ äçáøä äéùøàìéú àéï  ");

ファイル自体をどのエンコーディングで保存するかは非常に重要です。PHP の文字列はエンコーディングを気にせず、単にバイト配列として機能します。そのため、UTF-8 エンコーディングを使用してそのようなファイルを保存すると、もちろん文字列は UTF-8 で保存され、iconv はそれを WIN1255 から変換できません。これは UTF-8 であるためです。

私の提案は、1) サーバーから元のエンコーディングで文字列を取得することです。2) そのままの状態でファイルに保存します。3) そのファイルを使用して実験します。どこかにコピーして貼り付けようとすると、おそらくエンコーディングが変更されます。

また、16 進数エディターでデータを表示することも悪い考えではありません。そうすれば、ファイルに何が格納されているかを確認できます。

とにかく、あなたがしようとしていることは正しいようです:サーバーからWIN-1255データを取得し、それに対してiconv(...)を呼び出します。今ではUTF-8で、HTMLページに出力します(もちろんこれは<meta>UTF-8 であることを示す があります) 。

于 2012-05-01T16:36:26.243 に答える
1

再エンコードは必要ない場合があります。win-1255 の宣言されたエンコーディングを使用して同じコンテンツを単純に提供し、ブラウザーに処理させることができます。

再エンコードする場合は、サーバー上で次のように行う必要があります。

  1. リモート サーバーから文字列をフェッチします。
  2. 文字列のエンコーディングを決定します (http ヘッダーまたは html ヘッダーから)。
  3. 必要に応じてエンコーディングを utf-8 に変換します。
  4. 適切な utf-8 エンコーディング宣言を使用して、新しい値をクライアントに返します。

Content-Type: text/html;charset=utf8手順 4 でヘッダーが欠落している可能性がありますecho iconv(...)

一般的なケースでステップ 1 ~ 3 を実行できるサンプル関数を次に示します。

function getUrlAsUtf8($url) {
    $s = file_get_contents($url);
    if ($s) {
        $contenttype = preg_grep('/content-type:(?:(?:\r\n)?[ \t]+)*+((?:(?:(?:\r\n)[ \t]+)|[ \t\x20-\x7e\x80-\xff])*)/i', $http_response_header);
        $inputcharset = null;
        foreach ($contenttype as $ct) {
            if (preg_match('/charset\s*=\s*(.*?)(?:$|;)/i', $ct, $matches)) {
                $inputcharset = strtolower($matches[1]);
            }
        }
        if ($inputcharset and $inputcharset!=='utf-8') {
            $s = mb_convert_encoding($s, 'utf-8', $inputcharset);
        }
    }
    return $s;
}

echo getUrlAsUtf8('http://example.org');
于 2012-05-01T19:17:16.413 に答える