Почему php trim не действительно удаляет все пробелы и разрывы строк?

Я захватываю ввод из файла со следующим кодом

$jap= str_replace("\n","",addslashes(strtolower(trim(fgets($fh), " \t\n\r"))));

Я также ранее пробовал их при устранении неполадок

$jap= str_replace("\n","",addslashes(strtolower(trim(fgets($fh)))));
$jap= addslashes(strtolower(trim(fgets($fh), " \t\n\r")));

и если я эхо $jap, это выглядит нормально, поэтому позже в коде без каких-либо изменений в $jap он вставляется в БД, однако я заметил сравнительный тест, который проверяет, находится ли это jap уже в DB false, когда я могу ясно видеть, что, казалось бы, точно такая же запись jap находится в БД. Поэтому я копирую запись jap, которая была вставлена ​​прямо из phpmyadmin или с моего сайта, где отображается jap и вставляется в блокнот. Я замечаю, что он вставляется так... (это точная паста в приведенных ниже цитатах)

"

バ ス に の っ て, う み へ 行 き ま し た "

и, очевидно, мне нужно, это без этого пробела и разрывов или что бы это ни было.

насколько я могу сказать, что обрезка не делает то, что говорит, что это будет делать. или им что-то не хватает. если да, то что это?

UPDATE: в ответ на ответ Jacks

preg_replace не помогло, но вот что я сделал, я использовал bin2hex(), чтобы определить, что часть, которая "не является частью, которую я хочу", efbbbf Я сделал это, взяв $jap в str replace и удалив japanese, которого я ожидаю найти, и что осталось в bin2hex. и результатом был вышеупомянутый "efbbbf"

echo bin2hex(str_replace("どちらがあなたの本ですか","",$jap));

вывод выше был efbbbf но что это? могу ли я сделать str_replace, чтобы удалить это как-то?

Ответ 1

Функция trim не знает о белых пробелах в Юникоде. Вы можете попробовать следующее:

preg_replace('/^\p{Z}+|\p{Z}+$/u', '', $str);

Как взято из: Обрезать пробелы Unicode в PHP 5.2

В противном случае вы можете сделать bin2hex(), чтобы узнать, какие символы добавляются спереди.

Обновление

В вашем файле содержится спецификация UTF8; для его удаления:

$f = fopen("file.txt", "r");
$s = fread($f, 3);
if ($s !== "\xef\xbb\xbf") {
    // bom not found, rewind file
    fseek($f, 0, SEEK_SET);
}
// continue reading here