チャットシステムのあるウェブサイトを持っています。このチャットシステムにはテーブル「messages」があり、列の1つは「messagetext」がutf8_general_ci(MySQL)に設定されています。私のウェブサイトでは、phpを使用してデータベースをクエリしています。結果は大丈夫です。
私のアプリでは、NodeJSをバックエンドとして使用していますが、結果は "ασδασδ"のようになります。この列にはギリシャ語の単語が格納されています。
Iconv-lite、iconv、utf8、Jsonのデコードを試しました。
私の考えでは、Webサイトでは、列から値 'ασδασÎ'を取得してutf8にデコードしているため、正しい結果を確認できます。しかし、アプリではこれは発生していません。結果は実際のWordではなく値です。
私に何ができる?
(コメントより)
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
node.jsは、最初に次のようなものが必要です。
var connection = mysql.createConnection({ ... , charset : 'utf8'});
うん、ασδασδ
はギリシャ語に見えます。持っているのは「もじばけ」。 Mojibakeの原因の説明については、 https://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored を参照してください。
エンコード/デコード/変換の形式は使用しないでください。問題が複雑になるだけです。そのリンクが役に立たない場合は、それが要求する追加の詳細を提供してください。
参照 https://www.npmjs.com/package/utf8
フォームにはutf-8と記載する必要があります。
<form method="post" action="/your/url/" accept-charset="UTF-8">
分析...
'Κ'(ギリシャ語カッパ)は、utf8の2バイトの16進数 'CE9A'です。 latin1の 'Κ'は16進数の 'CE9A'(2バイト)です。'Κ 'は、utf8に変換すると16進数の' C38E C5A1 'になります。
注:この最後の16進数は、コメントに表示されるものです。
だから、あなたは「ダブルエンコーディング」をしているようです。
SELECT CONVERT(BINARY(CONVERT(CONVERT(BINARY(CONVERT('ÃŽÅ¡' USING latin1)) USING utf8mb4) USING latin1)) USING utf8mb4); --> 'Κ'
欠けているのは、データの流れの中で「latin1」が発生しているところです。