Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

マルチバイト文字が文字化けする(?) #45

Closed
maimuzo opened this issue Sep 27, 2014 · 7 comments
Closed

マルチバイト文字が文字化けする(?) #45

maimuzo opened this issue Sep 27, 2014 · 7 comments

Comments

@maimuzo
Copy link

maimuzo commented Sep 27, 2014

いわゆるチャットアプリを作っていて、WebブラウザとAndroidでチャットする前提なのですが、ブラウザ同士だと文字化けしない(socket.io-client.javaは噛まないので)んだけど、socket.io-client.javaを使ったAndroidとチャットするときは、マルチバイト文字部分だけ文字化けします。

・Androidから送信したマルチバイト文字(UTF8)をサーバ側でconsole.logすると、化けている
・サーバ内に文字列リテラル(UTF8)として定義してある文字をAndroidで受信すると化けている
・でも、化ける時と化けない時がある

化けるときの条件がよくわかってないのと、socket.io-client.java側じゃなくて、他のライブラリのせいで化けてる可能性もあるので、検証用のコード書いてみます。

@nkzawa
Copy link
Contributor

nkzawa commented Sep 27, 2014

報告ありがとうございます。
マルチバイト文字列は完全に対応してるつもりなのですが、再現条件等わかったらおしえてもらえると助かります!

@maimuzo
Copy link
Author

maimuzo commented Oct 1, 2014

検証用ファイルを用意してみました。
https://github.com/maimuzo/socket.io-client.java/tree/master/multibyte_test
上記のadb_log.txtを見てもらうのがわかりやすいと思います。

症状としては、
・ASCIIは化けない
・Androidの文字リテラルをサーバに送ると化ける
・サーバの文字リテラルをAndroidに送ると化ける
・Android->サーバ->Androidは化けない
のようです。

ただ、やはり再現性がわからないですが、正常に受信できる時もあります。(これは検証用のソースではなく、別アプリ側で確認しています)
マルチバイト文字を含むデータを何度か受信すると、ある時を境に正常に受信できて、またある時を境にできなくなります。
ソースを見てないですが、チャンクの関係でしょうか?

検証ファイルは用意してないですが、ブラウザ→サーバと、サーバ→ブラウザは大丈夫のようです。

@nkzawa
Copy link
Contributor

nkzawa commented Oct 1, 2014

詳細な報告ありがとうございます!!
一点気になったのですが、古いバージョンを使っているようなので、最新(0.2.0)にアップデートしてみてもらえますか?
サーバ側のsocket.ioのバージョンも知りたいです。
socket.ioの1.0.xと1.1.0で、若干のプロトコル変更があったためその影響の可能性がありそうです。

@maimuzo
Copy link
Author

maimuzo commented Oct 1, 2014

下記を参考に文字コード推定の検証してみました。
http://qiita.com/shoma2da/items/c77ec534dd36873d73c9

またファイルを更新しました。
https://github.com/maimuzo/socket.io-client.java/tree/master/multibyte_test
ここのcodec_check_node_log.txtがnode側のログですが、
node.js内の文字列リテラルがasciiと判定されていて、送られてきた文字列が(化けてますが)utf-8と判定されています。

もしかすると、node.jsの実行時にマルチバイトをasciiとして評価して実行するようなオプションがあるのかもしれないですが(調べても見つけられませんでした)、もしそんなオプションがなく、node.js内では文字列リテラルはUTF-8扱いされるのであれば、multibyteCharactorsがascii扱いされる理由がよくわからないですね。

一方Androidから受け取った文字がUTF-8なのは想定内なのですが、何故か文字化けしてしまっています。

自分はnode.jsに慣れてないので、このあたりがよくわかってないです。

dump ascii: abcABC123!"#
dump ascii2: abcABC123!#
dump multibyteCharactors: あいうえお
dump multibyteCharactors2: あいうえお
dump data: �����
detect ascii:
{ encoding: 'ascii', confidence: 1 }
detect ascii2:
{ encoding: 'ascii', confidence: 1 }
detect multibyteCharactors:
{ encoding: 'ascii', confidence: 1 }
detect multibyteCharactors2:
{ encoding: 'ascii', confidence: 1 }
detect data:
{ encoding: 'utf-8', confidence: 0.9690625 }

@maimuzo
Copy link
Author

maimuzo commented Oct 1, 2014

「node.jsの実行時にマルチバイトをasciiとして評価して実行するようなオプション」が意味不明だと思いますが、
ruby -K[kcode]
のようなものが、node.jsにもあるのかなと想定していました。

@maimuzo
Copy link
Author

maimuzo commented Oct 1, 2014

すいません。
compile 'com.github.nkzawa:socket.io-client:0.2.0'
これで直りました。orz
こんな初歩的な話だったとは…お手数掛けました。

ちなみに、
received ping, test_type: android json multibyte charactor, data: {"multibyteCharactors":"あいうえお"}
received ping, JSON.parse(data): [object Object]
dump ascii: abcABC123!"#
dump ascii2: abcABC123!#
dump multibyteCharactors: あいうえお
dump multibyteCharactors2: あいうえお
dump data: {"multibyteCharactors":"あいうえお"}
detect ascii:
{ encoding: 'ascii', confidence: 1 }
detect ascii2:
{ encoding: 'ascii', confidence: 1 }
detect multibyteCharactors:
{ encoding: 'ascii', confidence: 1 }
detect multibyteCharactors2:
{ encoding: 'ascii', confidence: 1 }
detect data:
{ encoding: 'ascii', confidence: 1 }
となって、やっぱりマルチバイト文字はasciiと推定されてしまいますね。
これは評価器側の問題な気もしますが。

お手数掛けました。ありがとうございました。

@maimuzo maimuzo closed this as completed Oct 1, 2014
@maimuzo
Copy link
Author

maimuzo commented Oct 1, 2014

一応履歴として。
$ node -v
v0.10.25
├─┬ socket.io@1.1.0
│ ├── debug@0.7.4
│ ├─┬ engine.io@1.4.0
│ │ ├── base64id@0.1.0
│ │ ├─┬ debug@1.0.3
│ │ │ └── ms@0.6.2
│ │ ├─┬ engine.io-parser@1.1.0
│ │ │ ├── after@0.8.1
│ │ │ ├── arraybuffer.slice@0.0.6
│ │ │ ├── base64-arraybuffer@0.1.2
│ │ │ ├── blob@0.0.2
│ │ │ └── utf8@2.0.0
│ │ └─┬ ws@0.4.31
│ │ ├── commander@0.6.1
│ │ ├── nan@0.3.2
│ │ ├── options@0.0.5
│ │ └── tinycolor@0.0.1
│ ├─┬ has-binary-data@0.1.3
│ │ └── isarray@0.0.1
│ ├─┬ socket.io-adapter@0.2.0
│ │ └─┬ socket.io-parser@2.1.2
│ │ ├─┬ emitter@1.0.1
│ │ │ └── indexof@0.0.1
│ │ ├── isarray@0.0.1
│ │ └── json3@3.2.6
│ ├─┬ socket.io-client@1.1.0
│ │ ├── component-bind@1.0.0
│ │ ├── component-emitter@1.1.2
│ │ ├─┬ engine.io-client@1.4.0
│ │ │ ├── component-inherit@0.0.3
│ │ │ ├─┬ engine.io-parser@1.1.0
│ │ │ │ ├── after@0.8.1
│ │ │ │ ├── arraybuffer.slice@0.0.6
│ │ │ │ ├── base64-arraybuffer@0.1.2
│ │ │ │ ├── blob@0.0.2
│ │ │ │ └── utf8@2.0.0
│ │ │ ├─┬ has-cors@1.0.3
│ │ │ │ └── global@2.0.1
│ │ │ ├─┬ parsejson@0.0.1
│ │ │ │ └─┬ better-assert@1.0.1
│ │ │ │ └── callsite@1.0.0
│ │ │ ├─┬ parseqs@0.0.2
│ │ │ │ └─┬ better-assert@1.0.1
│ │ │ │ └── callsite@1.0.0
│ │ │ ├─┬ parseuri@0.0.4
│ │ │ │ └─┬ better-assert@1.0.1
│ │ │ │ └── callsite@1.0.0
│ │ │ ├─┬ ws@0.4.31
│ │ │ │ ├── commander@0.6.1
│ │ │ │ ├── nan@0.3.2
│ │ │ │ ├── options@0.0.5
│ │ │ │ └── tinycolor@0.0.1
│ │ │ └── xmlhttprequest@1.5.0
│ │ ├─┬ has-binary@0.1.5
│ │ │ └── isarray@0.0.1
│ │ ├── indexof@0.0.1
│ │ ├── object-component@0.0.3
│ │ ├─┬ parseuri@0.0.2
│ │ │ └─┬ better-assert@1.0.1
│ │ │ └── callsite@1.0.0
│ │ ├─┬ socket.io-parser@2.2.2
│ │ │ ├── benchmark@1.0.0
│ │ │ ├── isarray@0.0.1
│ │ │ └── json3@3.2.6
│ │ └── to-array@0.1.3
│ └─┬ socket.io-parser@2.2.1
│ ├── benchmark@1.0.0
│ ├── component-emitter@1.1.2
│ ├── isarray@0.0.1
│ └── json3@3.2.6

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants