入力 UCS-2LE ファイルを通常の 8 ビット ISO-8859-1 テキストに変換するコードを作成しました。変換後、strtok 関数を使用してテキスト全体を単語に分割しています。今、取得した各単語に strlen を適用していますが、理解できない奇妙な単語の長さになっています。
<?php
$fileData = file('input.txt');
foreach( $fileData as $txt ){
$txt = iconv( 'ISO-8859-1', 'UCS-2LE', $txt );
$tok = strtok($txt, " \n\t");
while ($tok !== false) {
echo 'Word = '.$tok.', Length = '.strlen($tok).'<br />';
$tok = strtok(" \n\t");
}
}
?>
入力ファイル、ファイル名 = input.txt (UCS-2LE 内) は
Slot# NumJobs ActiveJobID ActiveBatchJob ActiveProcStartTime
0 0 1 input3.dat 7:20 PM
1 0 2 input3.dat 7:20 PM
出力は
Word = ÿþSlot#, Length = 24
Word = NumJobs, Length = 31
Word = ActiveJobID, Length = 47
Word = ActiveBatchJob, Length = 59
Word = ActiveProcStartTime , Length = 83
Word = , Length = 1
Word = 0, Length = 6
Word = 0, Length = 7
Word = 1, Length = 7
Word = input3.dat, Length = 43
Word = 7:20, Length = 19
Word = PM , Length = 15
Word = , Length = 1
Word = 1, Length = 6
Word = 0, Length = 7
Word = 2, Length = 7
Word = input3.dat, Length = 43
Word = 7:20, Length = 19
Word = PM , Length = 15
Word = , Length = 1
Word = , Length = 2
1) 長さが正しく表示されないのはどうしてですか。
2) 出力の 6 行目は、strtok によって適切にトークン化されていない改行文字です。なんで?
3) BOM について少し読んだところ、ファイルの最初の 2 文字が、使用されている文字の形式を識別するために使用されていることがわかりました。出力の最初の行のように、これらの文字を回避する方法はありますか?2 つの文字が余分に表示されています。
助けてくれてありがとう。