Оператор == всегда предназначен для сравнения ссылок на объекты, тогда как метод сравнения строк .equals () переопределяется для сравнения содержимого:
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1 == s2); // It prints false (reference comparison)
System.out.println(s1.equals(s2)); // It prints true (content comparison)
Я хотел бы добавить одну вещь к отличному ответу chazomaticus :
Не забудьте также тег META (например, или HTML4 или XHTML-версия этого файла ):
<meta charset="utf-8">
Это кажется тривиальным, но IE7 дал мне проблемы с этим раньше.
Я делал все правильно; база данных, соединение с базой данных и HTTP-заголовок Content-Type были настроены на UTF-8, и она отлично работала во всех других браузерах, но Internet Explorer по-прежнему настаивал на использовании «западноевропейской» кодировки.
It оказалось, что на странице отсутствует метка META. Добавление этого решения проблемы.
Правка:
У W3C фактически есть довольно большой раздел , посвященный I18N . У них есть ряд статей, связанных с этой проблемой & ndash; описывая HTTP, (X) HTML и CSS сторону вещей:
Они рекомендуют использовать как HTTP-заголовок, так и HTML метатег (или объявление XML в случае XHTML служил XML).
Хранение данных:
utf8mb4
для всех таблиц и текстовых столбцов в вашей базе данных. Это делает MySQL физически хранить и извлекать значения, закодированные изначально в UTF-8. Обратите внимание, что MySQL будет неявно использовать кодировку utf8mb4
, если задано сопоставление utf8mb4_*
(без какого-либо явного набора символов). utf8
, который поддерживает только подмножество символов Unicode. Мне хотелось бы, чтобы я шутил. Доступ к данным:
utf8mb4
. Таким образом, MySQL не выполняет преобразование из собственного UTF-8, когда он передает данные в ваше приложение и наоборот. charset
в DSN : $dbh = new PDO('mysql:charset=utf8mb4');
Если вы используете mysqli , вы можете вызвать set_charset()
: $mysqli->set_charset('utf8mb4'); // object oriented style
mysqli_set_charset($link, 'utf8mb4'); // procedural style
Если вы застряли в простой mysql , но, возможно, работаете с PHP & ge; 5.2.3 вы можете вызвать mysql_set_charset
. SET NAMES 'utf8mb4'
. utf8mb4
/ utf8
применяется, как указано выше. Выход:
default_charset
php.ini или вручную выпустить заголовок Content-Type
MIME самостоятельно, что больше работает, но имеет тот же эффект. Вход:
mb_check_encoding()
делает трюк, но вы должны использовать его религиозно. На самом деле этого не происходит, так как вредоносные клиенты могут отправлять данные в любую кодировку, и я не нашел трюка, чтобы заставить PHP сделать это для вас надежно. accept-charset
ко всем тэгам <form>
: <form ... accept-charset="UTF-8">
. Для HTML до HTML5 только : обратите внимание, что спецификация HTML W3C говорит, что клиенты «должны» по умолчанию отправлять формы обратно на сервер в любой кодировке, обслуживаемой сервером, но это, по-видимому, только рекомендация, следовательно, необходимо явно указывать на каждый тэг <form>
. Другие кодовые соображения:
mbstring
. mbstring
. В дополнение к настройке default_charset
в php.ini вы можете отправить правильную кодировку с помощью header()
из вашего кода перед любым выходом:
header('Content-Type: text/html; charset=utf-8');
Работа с Unicode в PHP легко, если вы понимаете, что большинство строковых функций не работают с Unicode, а некоторые могут полностью блокировать строки. PHP считает, что «символы» имеют длину 1 байт. Иногда это нормально (например, explode()
ищет только последовательность байтов и использует его как разделитель - так что неважно, какие фактические персонажи вы ищете). Но в других случаях, когда функция фактически предназначена для работы с символами , PHP не знает, что ваш текст имеет многобайтовые символы, которые находятся в Unicode.
Хорошая библиотека для проверки есть phputf8 . Это перезаписывает все «плохие» функции, чтобы вы могли безопасно работать с строками UTF8. Существуют расширения, такие как расширение mbstring, которые тоже пытаются это сделать для вас, но я предпочитаю использовать библиотеку, потому что она более переносимая (но я пишу продукты массового рынка, так что это важно для меня). Но phputf8 может использовать mbstring за кулисами, во всяком случае, для повышения производительности.
Поддержка Unicode в PHP по-прежнему огромна. Хотя он способен преобразовывать строку ISO8859 (которая используется внутри нее) в utf8, ей не хватает возможности работать с строками unicode изначально, что означает, что все функции обработки строк будут искажать и повреждать ваши строки. Таким образом, вам нужно либо использовать отдельную библиотеку для правильной поддержки utf8, либо самостоятельно переписать все функции обработки строк.
. Легкая часть - это просто указать кодировку в заголовках HTTP и в базе данных и т. Д., Но нет что имеет значение, если ваш PHP-код не выводит допустимый UTF8. Это сложная часть, и PHP практически не помогает. (Я думаю, что PHP6 должен исправить худшее из этого, но это все еще вдалеке)
Главный ответ отличный. Вот что я должен был на обычной установке debian / php / mysql:
// storage
// debian. apparently already utf-8
// retrieval
// the mysql database was stored in utf-8,
// but apparently php was requesting iso. this worked:
// ***notice "utf8", without dash, this is a mysql encoding***
mysql_set_charset('utf8');
// delivery
// php.ini did not have a default charset,
// (it was commented out, shared host) and
// no http encoding was specified in the apache headers.
// this made apache send out a utf-8 header
// (and perhaps made php actually send out utf-8)
// ***notice "utf-8", with dash, this is a php encoding***
ini_set('default_charset','utf-8');
// submission
// this worked in all major browsers once apache
// was sending out the utf-8 header. i didnt add
// the accept-charset attribute.
// processing
// changed a few commands in php, like substr,
// to mb_substr
, которая была всем!
Хорошая цель с самого начала - основанная на характере вашего сайта, я нашел много ресурсов по этому поводу в Googling - вы, конечно, не первый в этом разбираетесь.
Предполагается, что у мистического PHP6 все это выпрямилось, правда?
Вы можете в значительной степени установить utf-8 в качестве глобальной кодировки по умолчанию для mysql на уровне сервера, и она по умолчанию будет правильно соответствовать более гранулированных уровней.
Я только что прошел ту же проблему и нашел хорошее решение в руководствах PHP.
Я изменил всю свою кодировку файла на UTF8, а затем по умолчанию на мое соединение. Это решило все проблемы.
if (!$mysqli->set_charset("utf8")) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
} else {
printf("Current character set: %s\n", $mysqli->character_set_name());
}
set_charset('utf8mb4')
не работал, но >set_charset("utf8")
сделал, и это не было показано в других ответах.
– Funk Forty Niner
21 January 2017 в 15:16
set_charset("utf8")
может работать, но будет вести себя по-другому (см. Примечания о различии между utf8
и utf8mb4
и историей версий mysql). Используйте utf8
, если вам нужно И ТОЛЬКО , если вы знаете, что делаете !
– Martin Hennings
24 April 2018 в 10:09
Старая тема, я знаю. Нашел проблему с кем-то, использующим PDO, и ответ заключался в том, чтобы использовать это для строки подключения PDO:
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Сайт, на котором я взял это, отключен, смог получить его с помощью кеша google.
$dbh->exec("set names utf8");
, я предпочитаю представленный здесь метод). Btw. есть также аналогичная заметка в этом комментарии в руководстве PHP: php.net/manual/en/pdo.construct.php#96325 .
– Marten Koetsier
13 August 2015 в 13:55
В моем случае я использовал mb_split
, который использует регулярное выражение. Поэтому мне также пришлось вручную убедиться, что кодировка регулярного выражения была utf-8, выполнив mb_regex_encoding('UTF-8');
. В качестве побочной заметки я также обнаружил, запустив mb_internal_encoding()
, что внутренняя кодировка не была utf-8 , и я изменил это, выполнив mb_internal_encoding("UTF-8");
.
Прежде всего, если вы находитесь в & lt; 5.3PHP, то нет. У тебя много проблем, чтобы справиться.
Я удивлен, что никто не упомянул библиотеку intl , которая имеет хорошую поддержку для unicode, графем, строковых операций, локализации и многих других, см. ниже.
Я приведу некоторую информацию о поддержке Unicode в PHP с помощью слайдов Elizabeth Smith в PHPBenelux'14 Хорошо: Плохо : Я обновлю этот ответ, если что-то изменит добавленные функции и так далее. INTL
mb_string
ICONV
stream_filter_append($fp, 'convert.iconv.ISO-2022-JP/EUC-JP')
БАЗЫ ДАННЫХ
Некоторые другие Gotchas
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd
.
– Alexander Yancharuk
16 February 2014 в 19:54
В PHP вам нужно либо использовать функции multibyte , либо включить mbstring.func_overload . Таким образом, такие вещи, как strlen, будут работать, если у вас есть символы, которые принимают более одного байта.
Вам также потребуется определить набор символов ваших ответов. Вы можете использовать AddDefaultCharset, как указано выше, или написать PHP-код, который возвращает заголовок. (Или вы можете добавить тег META в свои HTML-документы.)
Недавно я обнаружил, что использование strtolower()
может вызвать проблемы, когда данные усекаются после специального символа.
Решение заключалось в использовании
mb_strtolower($string, 'UTF-8');
mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.
blockquote>
Если вы хотите, чтобы сервер MySQL решал набор символов, а не PHP как клиент (старое поведение, предпочтительнее, на мой взгляд), попробуйте добавить skip-character-set-client-handshake
к вашему my.cnf
в [mysqld]
и перезапустить mysql
.
Это может вызвать проблемы, если вы используете что-либо, кроме UTF8.
Единственное, что я хотел бы добавить к этим замечательным ответам, - это подчеркнуть сохранение ваших файлов в кодировке utf8, я заметил, что браузеры принимают это свойство за установку utf8 в качестве кодировки кода. Любой достойный текстовый редактор покажет вам это, например Notepad ++ имеет пункт меню для подделки файлов, он показывает текущую кодировку и позволяет вам ее изменить. Для всех моих php-файлов я использую utf8 без спецификации.
Некоторое время назад у меня кто-то попросил меня добавить поддержку utf8 для приложения php / mysql, разработанного кем-то другим, я заметил, что все файлы были закодированы в ANSI, поэтому мне пришлось использовать ICONV для преобразования всех файлов, измените таблицы базы данных, чтобы использовать кодировку utf8 и команду utf8_general_ci, добавьте «SET NAMES utf8» на уровень абстракции базы данных после подключения (при использовании 5.3.6 или более ранних версий в противном случае вы должны использовать charset = utf8 в строке подключения) и изменить Строковые функции для использования эквивалентных функций многобайтовых строк php.