Публикация специальных символов ajax [duplicate]

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

994
задан Machavity 9 January 2018 в 16:49
поделиться

12 ответов

В дополнение к настройке 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 за кулисами, во всяком случае, для повышения производительности.

55
ответ дан Christopher Nadeau 16 August 2018 в 08:00
поделиться
  • 1
    Задайте настройку перегрузки в php.ini. Это помогает при использовании многобайтовых строк. – Anthony Rutledge 21 December 2015 в 21:52

Поддержка Unicode в PHP по-прежнему огромна. Хотя он способен преобразовывать строку ISO8859 (которая используется внутри нее) в utf8, ей не хватает возможности работать с строками unicode изначально, что означает, что все функции обработки строк будут искажать и повреждать ваши строки. Таким образом, вам нужно либо использовать отдельную библиотеку для правильной поддержки utf8, либо самостоятельно переписать все функции обработки строк.

. Легкая часть - это просто указать кодировку в заголовках HTTP и в базе данных и т. Д., Но нет что имеет значение, если ваш PHP-код не выводит допустимый UTF8. Это сложная часть, и PHP практически не помогает. (Я думаю, что PHP6 должен исправить худшее из этого, но это все еще вдалеке)

6
ответ дан Chuck Burgess 16 August 2018 в 08:00
поделиться

Главный ответ отличный. Вот что я должен был на обычной установке 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

, которая была всем!

5
ответ дан commonpike 16 August 2018 в 08:00
поделиться

Я хотел бы добавить одну вещь к отличному ответу 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).

136
ответ дан Community 16 August 2018 в 08:00
поделиться
  • 1
    Нельзя ли также указать кодировку в заголовках HTTP? Вероятно, вам нужен вариант конфигурации для веб-сервера ... – oliver 20 November 2008 в 18:47
  • 2
    @oliver: Да, вы можете отправить его в HTTP-заголовке, но лучше отправить его в контент, потому что, если клиент сохраняет файл, он всегда сохраняет метатег. HTTP-заголовок, скорее всего, просто исчезнет, ​​если браузер не станет достаточно умным, чтобы скопировать его в метатег в сохраненном файле. – user 2 December 2008 в 02:49
  • 3

Хорошая цель с самого начала - основанная на характере вашего сайта, я нашел много ресурсов по этому поводу в Googling - вы, конечно, не первый в этом разбираетесь.

Предполагается, что у мистического PHP6 все это выпрямилось, правда?

Вы можете в значительной степени установить utf-8 в качестве глобальной кодировки по умолчанию для mysql на уровне сервера, и она по умолчанию будет правильно соответствовать более гранулированных уровней.

7
ответ дан dkretz 16 August 2018 в 08:00
поделиться

Я только что прошел ту же проблему и нашел хорошее решение в руководствах 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());
}

Просмотреть источник

11
ответ дан Funk Forty Niner 16 August 2018 в 08:00
поделиться
  • 1
    Я потратил час, пытаясь выяснить проблему кодирования на странице, над которой я работаю, и я обычно хорошо разбираюсь в вещах. Я всегда проконсультирую эту страницу, и ваш ответ мне очень помог. Получил мой взнос. В моем случае set_charset('utf8mb4') не работал, но >set_charset("utf8") сделал, и это не было показано в других ответах. – Funk Forty Niner 21 January 2017 в 15:16
  • 2
    @FunkFortyNiner Остерегайтесь: 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.

26
ответ дан iankit 16 August 2018 в 08:00
поделиться
  • 1
    Ищете это немного дальше, это необходимо только для версий PHP до 5.3.6. См. Также: http://stackoverflow.com/a/4361485/2286722 (хотя они используют отдельный $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");.

20
ответ дан JDelage 16 August 2018 в 08:00
поделиться
19
ответ дан Jimmy Kane 16 August 2018 в 08:00
поделиться

В PHP вам нужно либо использовать функции multibyte , либо включить mbstring.func_overload . Таким образом, такие вещи, как strlen, будут работать, если у вас есть символы, которые принимают более одного байта.

Вам также потребуется определить набор символов ваших ответов. Вы можете использовать AddDefaultCharset, как указано выше, или написать PHP-код, который возвращает заголовок. (Или вы можете добавить тег META в свои HTML-документы.)

8
ответ дан JW. 16 August 2018 в 08:00
поделиться
  • 1
    Большой совет по настройке func_overload - позволяет минимально модифицировать существующий код. – Simon East 15 January 2014 в 06:56
  • 2
    Просто будьте осторожны - какой-то код действительно может полагаться на однобайтовый характер стандартных строковых функций. – JW. 15 January 2014 в 20:18
  • 3
    Важно отметить, что функция mbstring.func_overload устарела с PHP 7.2 из-за проблем, отмеченных в комментарии @ JW выше. Поэтому лучший совет: да, вы должны определенно использовать функции mbstring, но не используйте функцию перегрузки, чтобы стандартные функции работали как многобайтовые. – Simba 7 February 2017 в 14:08

Недавно я обнаружил, что использование strtolower() может вызвать проблемы, когда данные усекаются после специального символа.

Решение заключалось в использовании

mb_strtolower($string, 'UTF-8');

mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.

13
ответ дан Martin 16 August 2018 в 08:00
поделиться

Если вы хотите, чтобы сервер MySQL решал набор символов, а не PHP как клиент (старое поведение, предпочтительнее, на мой взгляд), попробуйте добавить skip-character-set-client-handshake к вашему my.cnf в [mysqld] и перезапустить mysql.

Это может вызвать проблемы, если вы используете что-либо, кроме UTF8.

5
ответ дан Nikola Tulimirovic 16 August 2018 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: