Я создаю сценарий 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?