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でエンコードされた文字列で完全に機能するはずです。
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で機能したと思います。
The mb_split
Docs function should be fine, but you should define the charset it's using as well with mb_regex_encoding
Docs:
mb_regex_encoding('UTF-8');
About mb_detect_encoding
Docs: 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.
編集、あなたの投稿をよく読んだところです。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、配列内の文字列は正しいです)