2015-09-10 1 views
4

У меня проблема с Openfire и особенно поддержка символов emoji. Я искал в Интернете, узнал, что для поддержки emoji мне нужно изменить кодировку и сопоставление базы данных и таблиц в unicode UTF-8 (utf8mb4). Я сделал это с помощью следующей SQL-команд:Emoji не работает в автономном чате при использовании Openfire для чата между двумя устройствами iOS (с использованием MySQL db)

SET NAMES utf8mb4; 
ALTER DATABASE openfire CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 
ALTER TABLE ofOffline CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 

Так в формулировках выше, я меняю набор символов и порядок сопоставления базы данных и таблицы. Затем я прочитал, что я должен изменить драйвер JDBC для поддержки unicode. У меня есть следующее значение для записи «database.defaultProvider.serverURL» в моих свойствах системы (с помощью администратора веб-страницы Openfire):

jdbc:mysql://localhost:3306/openfire?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8 

Когда я отправляю сообщения с смайликам между двумя интернет-пользователей, это работает безупречно , Когда получатель сообщения находится в автономном режиме, сообщение сохраняется в базе данных, и это происходит неправильно: emoji неправильно хранится в базе данных (он хранится в виде двух вопросительных знаков).

Мой CREATE TABLE заявление выглядит следующим образом:

CREATE TABLE `ofMessageArchive` (
    `messageID` bigint(20) DEFAULT NULL, 
    `conversationID` bigint(20) NOT NULL, 
    `fromJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `fromJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `toJID` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL, 
    `toJIDResource` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL, 
    `sentDate` bigint(20) NOT NULL, 
    `stanza` mediumtext COLLATE utf8mb4_unicode_ci, 
    `body` mediumtext COLLATE utf8mb4_unicode_ci, 
    KEY `ofMessageArchive_con_idx` (`conversationID`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

Я попытался извлечения текста строфы (с таргетингом на него) с помощью следующего запроса (обратите внимание, что сообщение 73 содержит только один характер: Emoji):

SELECT stanza, HEX(stanza) FROM ofOffline WHERE messageID = 73 

Это дает мне (слева от - подписать сообщение, право на шестнадцатеричное значение):

- F09F9880 

При установке строфы в базе данных (в частности, ofOffline таблицы, в которой хранятся сообщения, которые должны быть доставлены в оффлайн пользователей), следующий код запускается на выполнении:

String msgXML = message.getElement().asXML(); 

Connection con = null; 
PreparedStatement pstmt = null; 
try { 
    con = DbConnectionManager.getConnection(); 
    pstmt = con.prepareStatement(INSERT_OFFLINE); 
    pstmt.setString(1, username); 
    pstmt.setLong(2, messageID); 
    pstmt.setString(3, StringUtils.dateToMillis(new java.util.Date())); 
    pstmt.setInt(4, msgXML.length()); 
    pstmt.setString(5, msgXML); 
    pstmt.executeUpdate(); 
} 

Я не уверен, что Я могу попробовать сейчас или есть ли другие способы обхода проблемы. Любая помощь будет принята с благодарностью.

Заранее благодарен!

+0

2 вопрос знак? Не 1 или 4? Пожалуйста, предоставьте 'SHOW CREATE TABLE'. –

+0

@RickJames Я предоставил вывод 'CREATE TABLE'. – Devos50

+0

Вы говорите, что это «хранится как 2 вопросительных знака». Но, возможно, он хранится правильно, но неправильно загружен. Пожалуйста, предоставьте 'SELECT emoji, HEX (emoji) FROM tbl WHERE ...'поэтому мы можем видеть гекс, который находится в таблице. –

ответ

2

После некоторого расследования я выяснил, что проблема, вероятно, связана с драйвером JDBC, который использует Openfire. Казалось, что мои параметры для строки подключения не были правильно проанализированы и использованы, поэтому я изменил строку драйвера подключения JDBC в conf/openfire.xml и перезапустил сервер. Теперь, когда я вставил смайлик, я получил следующее сообщение об ошибке:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\x80</...' for column 'stanza' at row 1 

После некоторого поиска для вышеуказанной ошибки, это было объяснено here, что я хотел бы добавить следующее к моей MySQL конфигурационный файл:

[mysqld] 
... 
character-set-server = utf8mb4 

Кроме того, я могу удалить параметр characterEncoding из строки подключения. После того, как я сделал эти изменения, перезапустил MySQL и openfire, вставка символов Emoji начала работать.

+0

Привет, я пробовал все. Мне нужна ваша помощь. Я установил utf8mb4 serverside. но все же он хранит вопросительные знаки. –