fwrite UTF-8 без спецификации

Чтобы записать данные в файл, закодированный в UTF-8 (с спецификацией):

function writeStringToFile($file, $string){
  $f=fopen($file, "wb");
  $string="\xEF\xBB\xBF".$string; // UTF-8
  fputs($f, $string);
  fclose($f);
}

Как записать данные в кодировке UTF-8 без спецификации?

Спасибо.

РЕДАКТИРОВАТЬ: скриншот из блокнота++ с кодировками:

введите здесь описание изображения


person ihtus    schedule 11.02.2014    source источник
comment
Просто не добавлять спецификацию (\xEF\xBB\xBF)?   -  person Rocket Hazmat    schedule 12.02.2014
comment
я думаю, что это был бы простой ANSI...   -  person ihtus    schedule 12.02.2014
comment
@ihtus: файл без спецификации - это просто набор байтов. Программное обеспечение, которое его обрабатывает, решает, как с ними обращаться.   -  person zerkms    schedule 12.02.2014
comment
скриншот из блокнота++ с кодировками: --- теперь открываем файл в HEX-редакторе.   -  person zerkms    schedule 12.02.2014
comment
@ihtus: я не совсем уверен.   -  person Rocket Hazmat    schedule 12.02.2014


Ответы (3)


Единственный способ, который я нашел, - это удалить спецификацию после создания файла.

<?php // change the pathname to your target file which you want to remove the BOM $pathname = "./test.txt"; $file_handler = fopen($pathname, "r"); $contents = fread($file_handler, filesize($pathname)); fclose($file_handler); for ($i = 0; $i < 3; $i++){ $bytes[$i] = ord(substr($contents, $i, 1)); } if ($bytes[0] == 0xef && $bytes[1] == 0xbb && $bytes[2] == 0xbf){ $file_handler = fopen($pathname, "w"); fwrite($file_handler, substr($contents, 3)); fclose($file_handler); printf("%s BOM removed. \n", $pathname); } ?>

person Zeke    schedule 09.06.2016

Строка "\xEF\xBB\xBF" соответствует формату «UTF-8 с BOM».

Если у вас есть строка в таком формате и вы хотите записать ее в файл с «простой» UTF-8, вам нужно удалить эти символы. Это можно сделать по-разному, например с помощью preg_replace :

function writeStringToFileUTF8($file, $string){
  $string = preg_replace("`\xEF\xBB\xBF`", "", $string);
  // this is equivalent as fopen(w)/fputs()/fclose()
  file_put_contents($file, $string);
}
person Asenar    schedule 13.09.2019

person    schedule
comment
Если быть точным: переменная $file даже не использовалась :-) - person zerkms; 12.02.2014
comment
О! действительно =) Пора спать xD Я думаю, должно быть что-то вроде $string=\xEF\xBB\xBF.$string; - person VoidVolker; 12.02.2014
comment
Хорошо, тогда нужно всего лишь вырезать 3 первых байта. - person VoidVolker; 12.02.2014