Я создаю скрипт для создания файла json, заполненного данными из базы данных. Я выполняю свой сценарий с консоли. Без использования HTML.
Проблема в том, что когда я открываю файл, все специальные символы отображаются вместе с кодом вместо фактического символа.
например:
sunt greșite. Vă rugăm să
Когда я копирую / вставляю строку из своего файла ЗДЕСЬ в текстовом редакторе stackoverflow, символы видны, но внутри моего файла json все, что я вижу, это:
Argilă //This is what I have in database and I need to write the accented word inside my json file.
Я уже пробовал:
htmlspecialchars()
, htmlspecialchars_decode()
, htmlentities()
.
моя функция:
public function writeToFile($fileName, $output, $mode) {
$writeFile = fopen( $fileName, $mode ) or die ("Unable to open file");
fwrite( $writeFile, htmlentities($output, ENT_QUOTES, 'UTF-8') );
fclose( $writeFile );
}
Я выполняю скрипт с терминала, он создает файл json. Я читаю эти данные из базы данных, которая сохраняется со специальным кодом вместо акцентированных символов. НО у вас есть отличная точка зрения. Итак, как я мог их преобразовать? : \
Я не уверен, что полностью понимаю. Значит, ваши данные уже закодированы в HTML в базе данных? Если вы хотите преобразовать обратно в обычный текст, вам нужно деcode его - попробуйте html_entity_decode
.
Обновил вопрос с дополнительной информацией. В моей базе данных есть Argilă
, но мне нужно преобразовать этот код в символы с диакритическими знаками и записать его в мой файл json.
попробуйте добавить следующее в свой php файл перед печатью любого html:
header ('Content-type: text/html; charset=utf-8');
и добавить
<meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" />
Я выполняю это только на терминале. HTML отсутствует, поэтому я не уверен, где разместить эти метаданные.
Вы также можете попробовать следующее: header ('Content-type: text / html; charset = iso8859-15'); Я не уверен, что это работает для вас или нет!
Уже пробовал. Как указывает @iainn, возможно, нет смысла использовать какую-либо функцию с html
в ее имени, поскольку я только записываю все данные в файл json, верно? Не знаю, как их преобразовать сейчас.
Похоже, ваши данные уже закодированы в HTML в базе данных, поэтому вам нужно сначала запустить их через html_entity_decode
:
$string = 'sunt greșite. Vă rugăm să';
echo html_entity_decode($string);
// sunt greșite. Vă rugăm să
Чтобы затем преобразовать в JSON, используйте json_encode
. По умолчанию это преобразует любые многобайтовые символы в escape-последовательности Unicode, например
echo json_encode('sunt greșite. Vă rugăm să');
// "sunt gre\u0219ite. V\u0103 rug\u0103m s\u0103"
На самом деле это не должно вызывать никаких проблем - все, что читает файл JSON, будет знать, как декодировать их обратно в правильные символы, и вы избежите проблем с кодировкой файлов, вызывающих дальнейшие проблемы. Если вы знаете, что вам нужны незакодированные символы в выводе, вы можете использовать константу JSON_UNESCAPED_UNICODE
, чтобы предотвратить это:
echo json_encode('sunt greșite. Vă rugăm să', JSON_UNESCAPED_UNICODE);
// "sunt greșite. Vă rugăm să"
Ваш метод writeToFile
должен выглядеть примерно так:
public function writeToFile($fileName, $output, $mode) {
$writeFile = fopen( $fileName, $mode ) or die ("Unable to open file");
fwrite( $writeFile, json_encode( html_entity_decode($output), JSON_UNESCAPED_UNICODE );
fclose( $writeFile );
}
Спасибо за ответ ! Я попробовал ваш ответ, но все время получаю только код вместо настоящего символа. Not char, что еще попробовать = \
"JSON_UNESCAPED_UNICODE" у меня работает. Я отправлял стандартный массив в виде сообщения (из API). Я пробовал такие вещи, как header ('Content-type: text / html; charset = utf-8'); заголовок ('Content-type: text / html; charset = iso8859'); но не работает. Итак, я попробовал JSON_UNESCAPED_UNICODE и отлично работает!
Если вы выполняете это в терминале, почему вы вообще используете
htmlentities
? Не похоже, что какая-либо функция с "html" в названии поможет вам.