Я хочу вывести следующую строку в PHP:
ä ö ü ß €
Поэтому я закодировал его в utf8 вручную:
ä ö ü ß  €
Итак, мой сценарий:
<?php header('content-type: text/html; charset=utf-8'); echo 'ä ö ü ß €'; ?>
Первые 4 символа верны (ä ö ü ß), но, к сожалению, знак «E» неверен:
ä ö ü ß
Здесь вы можете это увидеть.
Можете ли вы сказать мне, что я сделал неправильно? Мой редактор (Notepad ++) имеет настройки для кодирования (Ansi / UTF-8) и Format (Windows / Unix). Нужно ли менять их?
Я надеюсь, что вы можете мне помочь. Заранее спасибо!
Этот последний символ просто не находится в файле (попробуйте просмотреть источник), поэтому вы его не видите.
Я думаю, вам лучше сэкономить файл PHP как UTF-8 (в Notepad ++ эти параметры доступны в формате -> Кодирование в UTF-8 без спецификации) и вставка фактических символов в ваш PHP-файл (то есть в Notepad ++) а не взламывать с вставкой Ã
повсюду. Карта символов Windows может быть полезной для вставки символов Юникода.
Знак Euro (U + 20AC) кодируется в UTF-8 с тремя байтами, а не с двумя. Это можно увидеть здесь . Таким образом, ваша кодировка просто неверна.
Если вы хотите правильно вывести его на utf8, ваш скрипт должен быть:
<?php header('content-type: text/html; charset=utf-8'); echo "\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac"; ?>
Таким образом, даже если ваш php-скрипт будет сохранен в кодировке не-utf-8, он все равно будет работать.
Вы всегда должны настроить редактор на ту же кодировку, что сгенерированный HTML указывает браузеру на использование. Если HTML-страницу должна интерпретироваться как UTF-8, тогда установите текстовый редактор в UTF-8. PHP полностью не знает настройки кодировки редактора, используемые для создания файла; он обрабатывает строки как поток байтов.
Другими словами, если в файле находятся правые байты, все будет работать. И самый простой способ обеспечить правильные байты в файле – это настроить кодировку на ту же самую, на которой должна находиться веб-страница. Все остальное просто усложняет жизнь, чем это должно быть.
Но лучшая защита заключается в том, чтобы полностью оставить символы, отличные от ASCII, из кода. Вы можете вытащить их из базы данных или файла локализации. Это означает, что код может быть модифицирован практически в любом редакторе, не беспокоясь о повреждении кодировки.
header('Content-Type: text/html; charset=UTF-8');
Это просто информирует браузеры о том, какой контент вы собираетесь отправить и как он должен его обработать. Он не устанавливает кодировку фактического содержимого, которое вы отправляете. Это полностью зависит от вас, чтобы выполнить свое обещание. Ваш контент не будет волшебным образом преобразовываться из любого в UTF-8 только потому, что вы устанавливаете этот заголовок. Если вы скажете браузеру обрабатывать контент как UTF-8, но вы отправляете его закодированные данные Latin-1, конечно, он сломается.
Я отсылаю вас к тому, что каждый программист абсолютно, положительно должен знать о кодировках и наборах символов для работы с текстом
это сработало для меня
if (mb_check_encoding($value, 'UTF-8')) { return $value = utf8_encode($value); } else { return $value; }