node.jsサーバとのやりとりですが、日本語が送受信できません
まず受信した日本語がうまく表示できません
webから取得した文字列は下記のように表示されます
\U00e6\U0097\U00a5\U00e6\U009c\U00ac
本当は"日本"になるはずです
nodeサーバ側からの送信は
javascript
1var msg = new Object(); 2msg.cmd = '日本'; 3io.sockets.json.emit('messageHeat', { value: msg }); 4 });
iOS側はこんな感じで受信しています
swift3
1socket = SocketIOClient(socketURL: URL(string: "192.168.1.100")!, config: [.log(false), .forcePolling(true)]) 2 3socket.on("Message") { data, emitter in 4let mes = String(describing: data) 5let msgcmd = //ここでパースしてmsg.cmdを取り出します 6self.myTextfield( str: msgcmd) 7 8 } 9socket.connect() 10
送信するときもうまく送信できません
文字コードを変換する必要があると思うのですが
どうやればいいのでしょう
swift3
1 let post = "日本" 2 socket.emit("message",post)
iOS(macOS?)側のコードを書いて下さい。ちなみに「\U00e6\U0097\U00a5\U00e6\U009c\U00ac」は「日本」です。
「\U00e6\U0097\U00a5\U00e6\U009c\U00ac」はどうやって確認したのでしょうか?そのコードもしくは方法を書いて下さい。ちなみにこれはUTF-8です。
Scoketで受け取ったデータをパースして、そのままテキストフィールドの.textに入れただけで、たぶん普通なら「日本」と表示されるだろうと思ったんですが、\Uの形で表示されてしまいました
送信の場合も日本語は何かのコードに変換されて送られるようで、コントロールコードが含まれたものになってしまって、うまく送れません。ちなみに送信も受信もアルファベットや数字は問題なくうやり取りできます
パース前のmesの時点では「日本」はどうなっているでしょうか?print(msgcmd)はやはりコードが表示されるでしょうか?
パースの前にコードになっていました
dataの型は何でしょうか?
value = { name = "\U00e6\U0097\U00a5\U00e6\U009c\U00ac"; address = xyz; } こんな感じです
print(type(of: data)) の出力を教えて下さい。
Stringでした
dataの時点で「日本」じゃないんでしょうか?
\U....になってます。Node側で操作が必要なのでしょうか?ブラウザでは問題なく日本語でやりとりできているのですが...
パースのコードを書けますか?
パースの部分は恥ずかしいので書きたくないんですが、パースの前にコードになっているから、関係ないような気がするのですがダメですかね
とりあえずいいです。print(data)の出力を教えて下さい。
[{ value = { myName = "\U00e6\U0097\U00a5\U00e6\U009c\U00ac"; }; }]
他にもアルファベットの部分はありますが、問題なく届いてます
前のコメントでも気になっていたのですが、受信データはJSONじゃないんでしょうか?
たぶん、そうです、自信がないものではっきりとJSONだと言えませんでした
よくわからないのでパースも手作業で行なっています
手作業というのはパーサーに頼らずという意味です
node.jsは全然知らないのですが、io.sockets.json.emit() ってJSON送るときに使うのでは?
そう思います
そう思うのなら、少なくともそこは修正しないとダメですよね。別にJSONで送りたいわけじゃないんですよね?あと、"日本"を"\U00e6\U0097\U00a5\U00e6\U009c\U00ac"にしているのは、あなたのコードなのでしょうか?それともnode.jsなのでしょうか?(node.js分かる人が見たら瞬殺しそうな質問に思えてきましたw)
ブラウザで受け取った場合はちゃんと「日本」で受け取れているのでiOSの受信する側の問題だと思っていて、単純に\U00e6\U0097\U00a5\U00e6\U009c\U00acを受け取ったStringを文字コード変換で日本にできればいいかなと思ったのです
回答2件
あなたの回答
tips
プレビュー