Node JS: эмодзи в utf8-запросе возвращает � символов - PullRequest
0 голосов
/ 24 марта 2020

Я создаю сценарий Node.js для извлечения данных с веб-сайта, тело которого содержит смайлики, и затем вставки текста (включая смайлики) в базу данных MySQL.

Однако некоторые смайлики не отображаются быть правильно закодирован, что не позволяет мне вставлять текст в базу данных.

При попытке вставить строку, содержащую смайлик в виде кошачьего лица (?), в базу данных MySQL я получил ошибку ER_TRUNCATED_WRONG_VALUE_FOR_FIELD, которая указывает проблема с кодировкой. Однако тип содержимого ответа был charset=utf-8, а код моей базы данных - utf8mb4_unicode_ci, поэтому теоретически я должен иметь возможность вставлять полный диапазон символов Юникода. Если я пытаюсь вставить ? в базу данных с помощью phpmyadmin, запрос успешно завершается, что указывает на проблему в том, как мой Node.js скрипт извлекает данные.

Например, при попытке извлечь данные из страница смайликов для Cat Face мой скрипт (ниже) неправильно печатает смайлики кошачьих лиц, вместо этого печатает �. Похоже, это происходит только с некоторыми смайликами. Например, футбольный мяч Emoji (⚽) напечатан моим сценарием очень хорошо. Возможно, это связано с длиной кодовых точек, поскольку футбольный мяч (U+26BD) меньше, чем лицо кошки (U+1F431)?

const request = require('request');
const jsdom = require('jsdom');
const $ = require('jquery')(new jsdom.JSDOM().window);

request({
    url: 'https://emojipedia.org/emoji/%F0%9F%90%B1/', // This is the url for the cat face page
    encoding: 'utf8'
}, (err, response, htmlString) => {
    let html = ParseHTML(htmlString);
    let emojiElement = html.find('h1 .emoji');
    console.log(emojiElement.text()); // prints: �
    console.log(emojiElement.text().length); // prints: 2

    database.query('UPDATE `posts` SET `emoji` = ? WHERE `id` = 1', [emojiElement.text()], function (err, results) {
        if (err) throw err; // Error: ER_TRUNCATED_WRONG_VALUE_FOR_FIELD
    });

});

function parseHTML(htmlString) {
    const dom = new jsdom.JSDOM(htmlString);

    dom.window.document.querySelectorAll('script').forEach(element => element.remove());
    dom.window.document.querySelectorAll('head').forEach(element => element.remove());
    dom.window.document.querySelectorAll('link').forEach(element => element.remove());
    dom.window.document.querySelectorAll('style').forEach(element => element.remove());
    dom.window.document.querySelectorAll('iframe').forEach(element => element.remove());
    dom.window.document.querySelectorAll('noscript').forEach((element) => {
        let replacement = dom.window.document.createElement('div');
        replacement.setAttribute('class', 'noscript');
        replacement.innerHTML = element.innerHTML;
        element.parentNode.replaceChild(replacement, element);
    });
    dom.window.document.querySelectorAll('img[src]').forEach((element) => {
        const src = element.getAttribute('src');
        element.setAttribute('data-src', src);
        element.removeAttribute('src');
    });
    dom.window.document.querySelectorAll('[style]').forEach((element) => {
        element.removeAttribute('style');
    });

    return $(dom.window.document.documentElement.innerHTML);
}

Как правильно получить смайлики по запросу в Node.js чтобы их можно было вставить в базу MySQL?

1 Ответ

1 голос
/ 24 марта 2020

Вы должны инициализировать вашу базу данных с параметром charset: 'utf8mb4'.

Кроме того, поле, содержащее строку, содержащую символы Emoji, также должно использовать эту кодировку.

Пожалуйста, приведите пример настройки вашей БД и схему таблицы для дополнительного контекста, или рассмотрите этот пример:

const mysql = require('mysql');

const connection = mysql.createPool({
  connectionLimit: 10,
  host: process.env.DB_HOST || '127.0.0.1',
  user: process.env.DB_USER || 'local_user',
  password: process.env.DB_PASSWORD || 'local_password',
  database: process.env.DB_NAME || 'local_database',
  multipleStatements: true, 
  charset: 'utf8mb4' // necessary if you might need support for emoji characters
});

https://github.com/dusthaines/mysqljs_setup_snippet/blob/master/app.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...