Как написать слово с ударением с помощью эха php

Я создаю скрипт для создания файла 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 );

   }

Если вы выполняете это в терминале, почему вы вообще используете htmlentities? Не похоже, что какая-либо функция с "html" в названии поможет вам.

iainn 11.04.2018 14:13

Я выполняю скрипт с терминала, он создает файл json. Я читаю эти данные из базы данных, которая сохраняется со специальным кодом вместо акцентированных символов. НО у вас есть отличная точка зрения. Итак, как я мог их преобразовать? : \

PlayHardGoPro 11.04.2018 14:14

Я не уверен, что полностью понимаю. Значит, ваши данные уже закодированы в HTML в базе данных? Если вы хотите преобразовать обратно в обычный текст, вам нужно деcode его - попробуйте html_entity_decode.

iainn 11.04.2018 14:22

Обновил вопрос с дополнительной информацией. В моей базе данных есть Argilă, но мне нужно преобразовать этот код в символы с диакритическими знаками и записать его в мой файл json.

PlayHardGoPro 11.04.2018 14:25
2
4
384
2

Ответы 2

попробуйте добавить следующее в свой php файл перед печатью любого html:

header ('Content-type: text/html; charset=utf-8');

и добавить

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Я выполняю это только на терминале. HTML отсутствует, поэтому я не уверен, где разместить эти метаданные.

PlayHardGoPro 11.04.2018 14:10

Вы также можете попробовать следующее: header ('Content-type: text / html; charset = iso8859-15'); Я не уверен, что это работает для вас или нет!

Leet Hudka 11.04.2018 14:13

Уже пробовал. Как указывает @iainn, возможно, нет смысла использовать какую-либо функцию с html в ее имени, поскольку я только записываю все данные в файл json, верно? Не знаю, как их преобразовать сейчас.

PlayHardGoPro 11.04.2018 14:17

Похоже, ваши данные уже закодированы в HTML в базе данных, поэтому вам нужно сначала запустить их через html_entity_decode:

$string = 'sunt gre&#537;ite. V&#259; rug&#259;m s&#259;';
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, что еще попробовать = \

PlayHardGoPro 11.04.2018 14:54

"JSON_UNESCAPED_UNICODE" у меня работает. Я отправлял стандартный массив в виде сообщения (из API). Я пробовал такие вещи, как header ('Content-type: text / html; charset = utf-8'); заголовок ('Content-type: text / html; charset = iso8859'); но не работает. Итак, я попробовал JSON_UNESCAPED_UNICODE и отлично работает!

Maximiliano Bertiaux 03.05.2021 23:30

Другие вопросы по теме