4
4

4 に答える 4

4

UTF-8には、ASCII互換であるという非常に優れた機能があります。これで私はそれを意味します:

  • UTF-8にエンコードされた場合、ASCII文字は同じままです
  • 他の文字はASCII文字にエンコードされません

これは、UTF-8文字列をASCII文字であるセミコロン文字で分割しようとすると、;標準の1バイト文字列関数を使用できることを意味します。

あなたの例では、使用するだけでexplode(';',$utf8encodedText)、すべてが期待どおりに機能するはずです。

PS:UTF-8エンコーディングにはプレフィックスがないため、実際にはexplode()UTF-8でエンコードされた任意のセパレータで使用できます。

PPS:CSVファイルを解析しようとしているようです。fgetcsv()関数を見てください。区切り文字や引用符などにASCII文字を使用している限り、UTF-8でエンコードされた文字列で完全に機能するはずです。

于 2011-12-03T22:32:49.947 に答える
1

PHPでデバッグ/テストスクリプトを作成するときは、多かれ少なかれ有効なHTMLページを出力するようにしてください。

私は次のようなPHPファイルを使用するのが好きです。

<!DOCTYPE html>
<html>
  <head>
    <meta charset=utf-8>
    <title>Test page for project XY</title>
  </head>
  <body>
     <h1>Test Page</h1>
     <pre><?php
        echo print_r($_GET,1);
     ?></pre>
  </body>
</html>

HTMLタグを含めないと、ブラウザがファイルをテキストファイルとして解釈し、あらゆる種類の奇妙なことが起こる可能性があります。あなたの場合、ブラウザがファイルをLatin1でエンコードされたテキストファイルとして解釈したと思います。BOMが存在するときはいつでも、ブラウザがファイルをUTF-8ファイルとして認識したため、BOMで機能したと思います。

于 2011-12-04T17:35:21.133 に答える
1

The mb_splitDocs function should be fine, but you should define the charset it's using as well with mb_regex_encodingDocs:

mb_regex_encoding('UTF-8');

About mb_detect_encodingDocs: it can fail, but that's just by the fact that you can never detect an encoding. You either know it or you can try but that's all. Encoding detection is mostly a gambling game, however you can use the strict parameter with that function and specify the encoding(s) you're looking for.

How to remove the BOM mask:

You can filter the string input and remove a UTF-8 bom with a small helper function:

/**
 * remove UTF-8 BOM if string has it at the beginning
 *
 * @param string $str
 * @return string
 */
function remove_utf8_bom($str)
{
   if ($bytes = substr($str, 0, 3) && $bytes === "\xEF\xBB\xBF") 
   {
       $str = substr($str, 3);
   }
   return $str;
}

Usage:

$line = remove_utf8_bom($line);

There are probably better ways to do it, but this should work.

于 2011-12-03T17:43:40.057 に答える
1

編集、あなたの投稿をよく読んだところです。BOM が mb_split() によって導入されたことを示唆しているため、これは false を出力する必要があることを示唆しています。

header('content-type: text/plain;charset=utf-8');
$s = "zpHOmM6Xzp3OkTvOkc6ZzpPOkc6bzpXOqTsxMjI0MjszNy45OTQ1MjsyMy42ODg5";
$str = base64_decode($s);

$peices = mb_split(';', $str);

var_dump(substr($str, 0, 10) === $peices[0]);
var_dump($peices);

そうですか?私にとっては期待どおりに機能します(bool true、配列内の文字列は正しいです)

于 2011-12-03T20:04:45.267 に答える