it-swarm.com.de

NodeJS-Problem mit utf8_general_ci

Ich habe eine Website mit einem Chat-System. Dieses Chat-System hat eine Tabelle 'messages' und eine der Spalten ist 'messagetext' auf utf8_general_ci (MySQL) gesetzt. Auf meiner Website verwende ich PHP, um die Datenbank abzufragen. Die Ergebnisse sind in Ordnung.

In meiner App verwende ich NodeJS als Backend, aber die Ergebnisse sind wie folgt: "Î ± σδΠ± σδ". In dieser Spalte sind griechische Wörter gespeichert.

Ich habe versucht, iconv-lite, iconv, utf8, Json zu dekodieren.

Mein Gedanke, auf der Website wird der Wert 'Î ± σδΠ± σÎ' von Spalte und Dekodierung nach utf8 angezeigt. So kann ich die richtigen Ergebnisse sehen. ABER in der App passiert dies nicht, die Ergebnisse sind der Wert anstelle des tatsächlichen Wortes.

Was kann ich machen?

(aus Kommentar)

CREATE TABLE messages (
    id int(11) NOT NULL AUTO_INCREMENT, 
    sender int(11) NOT NULL, 
    reciever int(11) NOT NULL, 
    seen varchar(3) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
    datetime datetime NOT NULL, 
    messagetext text NOT NULL, 
    userseen varchar(3) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'no', 
    PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8
3
Bill

node.js benötigt zunächst Folgendes:

var connection = mysql.createConnection({ ... , charset : 'utf8'});

Ja, ασδασδ sieht für mich griechisch aus. Was Sie haben, ist "Mojibake". Siehe https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored für eine Diskussion der Ursachen von Mojibake.

Verwenden Sie keine Form von Codierung/Decodierung/Konv - dies verstärkt nur das Problem. Wenn dieser Link Ihnen nicht hilft, geben Sie die zusätzlichen Details an, die er anfordert.

Siehe auch https://www.npmjs.com/package/utf8

Das Formular sollte utf-8 erwähnen:

<form method="post" action="/your/url/" accept-charset="UTF-8">

Analyse...

'Κ' (griechischer Kappa) sind die 2 Bytes, hex 'CE9A', in utf8. 'Κ' in latin1 ist hex 'CE9A' (2 Bytes) 'Κ', wenn in utf8 konvertiert wird, ist hex 'C38E C5A1' 'ÃŽÅ¡' das, was aussieht, wenn es als latin1 interpretiert wird.

Hinweis: Dieses letzte Hex ist das, was Sie in Ihrem Kommentar anzeigen.

Sie scheinen also eine "doppelte Codierung" zu haben.

SELECT CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('ÃŽÅ¡' USING latin1)) USING utf8mb4) USING latin1)) USING utf8mb4);  --> 'Κ'

Was fehlt, ist, wo "latin1" im Datenfluss auftritt.

1
Rick James