2

文字列をiso-8859-1からutf-8に変換しようとしています。しかし、これらの2つの文字€と•を見つけると、関数は2つの数字が入った正方形の文字を返します。

この問題を解決するにはどうすればよいですか?

4

4 に答える 4

8

あなたが探しているエンコーディングは、Windowsコードページ1252(西ヨーロッパ)だと思います。ISO-8859-1(または8859-15)と同じではありません。0xA0-0xFFの範囲の文字は8859-1と一致しますが、cp1252は0x80-0x9Fの範囲にさまざまな文字を追加し、ISO-8859-1はほとんど使用されない制御コードを割り当てます。

text/html;charset=iso-8859-1歴史的な理由から、ページをとして提供する場合、ブラウザは実際にcp1252を使用するため(したがって、cp1252でもフォームを送信するため)、混乱が生じます。

iconv('cp1252', 'utf-8', "\x80 and \x95")
-> "\xe2\x82\xac and \xe2\x80\xa2"
于 2010-09-02T15:07:05.527 に答える
2

常に最初にエンコーディングを確認してください!エンコーディングを盲目的に信頼してはいけません(たとえそれがあなた自身のウェブサイトからのものであっても!):

function convert_cp1252_to_utf8($input, $default = '') {
    if ($input === null || $input == '') {
        return $default;
    }

    // https://en.wikipedia.org/wiki/UTF-8
    // https://en.wikipedia.org/wiki/ISO/IEC_8859-1
    // https://en.wikipedia.org/wiki/Windows-1252
    // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
        /*
         * Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
         * and control characters, always convert from Windows-1252 to UTF-8.
         */
        $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
    }
    return $input;
}
于 2014-04-24T15:24:13.483 に答える
0

iso-8859-1には€記号が含まれていないため、文字列に含まれている場合、文字列をiso-8859-1で解釈することはできません。代わりにiso-8859-15を使用してください。

于 2010-09-02T14:49:25.647 に答える
0

これらの2文字はiso-8859-1では違法です(iso-8859-15を意味しましたか?)

$ php -r 'echo iconv("utf-8","iso-8859-1//TRANSLIT","ter € and • the");'
ter EUR and o the
于 2010-09-02T14:49:33.727 に答える