web-dev-qa-db-ja.com

utf8_general_ciでのNodeJSの問題

チャットシステムのあるウェブサイトを持っています。このチャットシステムにはテーブル「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
3
Bill

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」が発生しているところです。

1
Rick James