質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

2927閲覧

iosのsocket通信で日本語がうまく送受信できません

apple2

総合スコア37

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Socket.IO

Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/06/03 05:59

編集2017/06/05 07:43

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)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2017/06/05 07:25 編集

iOS(macOS?)側のコードを書いて下さい。ちなみに「\U00e6\U0097\U00a5\U00e6\U009c\U00ac」は「日本」です。
fuzzball

2017/06/05 07:55

「\U00e6\U0097\U00a5\U00e6\U009c\U00ac」はどうやって確認したのでしょうか?そのコードもしくは方法を書いて下さい。ちなみにこれはUTF-8です。
apple2

2017/06/05 07:59

Scoketで受け取ったデータをパースして、そのままテキストフィールドの.textに入れただけで、たぶん普通なら「日本」と表示されるだろうと思ったんですが、\Uの形で表示されてしまいました
apple2

2017/06/05 08:01

送信の場合も日本語は何かのコードに変換されて送られるようで、コントロールコードが含まれたものになってしまって、うまく送れません。ちなみに送信も受信もアルファベットや数字は問題なくうやり取りできます
fuzzball

2017/06/05 08:10

パース前のmesの時点では「日本」はどうなっているでしょうか?print(msgcmd)はやはりコードが表示されるでしょうか?
apple2

2017/06/05 08:14

パースの前にコードになっていました
fuzzball

2017/06/05 08:38

dataの型は何でしょうか?
apple2

2017/06/05 09:04

value = { name = "\U00e6\U0097\U00a5\U00e6\U009c\U00ac"; address = xyz; } こんな感じです
fuzzball

2017/06/05 09:28

print(type(of: data)) の出力を教えて下さい。
apple2

2017/06/05 10:50

Stringでした
fuzzball

2017/06/05 11:14

dataの時点で「日本」じゃないんでしょうか?
apple2

2017/06/05 11:17

\U....になってます。Node側で操作が必要なのでしょうか?ブラウザでは問題なく日本語でやりとりできているのですが...
fuzzball

2017/06/06 00:06

パースのコードを書けますか?
apple2

2017/06/06 00:19

パースの部分は恥ずかしいので書きたくないんですが、パースの前にコードになっているから、関係ないような気がするのですがダメですかね
fuzzball

2017/06/06 00:23

とりあえずいいです。print(data)の出力を教えて下さい。
apple2

2017/06/06 00:28

[{ value = { myName = "\U00e6\U0097\U00a5\U00e6\U009c\U00ac"; }; }]
apple2

2017/06/06 00:29

他にもアルファベットの部分はありますが、問題なく届いてます
fuzzball

2017/06/06 00:35

前のコメントでも気になっていたのですが、受信データはJSONじゃないんでしょうか?
apple2

2017/06/06 00:37

たぶん、そうです、自信がないものではっきりとJSONだと言えませんでした
apple2

2017/06/06 00:37

よくわからないのでパースも手作業で行なっています
apple2

2017/06/06 00:40

手作業というのはパーサーに頼らずという意味です
fuzzball

2017/06/06 00:44 編集

node.jsは全然知らないのですが、io.sockets.json.emit() ってJSON送るときに使うのでは?
apple2

2017/06/06 00:44

そう思います
fuzzball

2017/06/06 00:54 編集

そう思うのなら、少なくともそこは修正しないとダメですよね。別にJSONで送りたいわけじゃないんですよね?あと、"日本"を"\U00e6\U0097\U00a5\U00e6\U009c\U00ac"にしているのは、あなたのコードなのでしょうか?それともnode.jsなのでしょうか?(node.js分かる人が見たら瞬殺しそうな質問に思えてきましたw)
apple2

2017/06/06 00:56

ブラウザで受け取った場合はちゃんと「日本」で受け取れているのでiOSの受信する側の問題だと思っていて、単純に\U00e6\U0097\U00a5\U00e6\U009c\U00acを受け取ったStringを文字コード変換で日本にできればいいかなと思ったのです
guest

回答2

0

変換は必要ないと思います。
server socket.io ver 1.0
client socket.io ver 10 になっていませんか?
上記の場合は、ver 10が対応していないので clientを ver 9.0 にすればいいかと。
https://github.com/socketio/socket.io-client-swift/issues/707

投稿2017/06/26 12:40

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

根本的な解決にはなっていないような気がしますが、お役に立てれば幸いです。

swift

1let utf8 = "\\U00e6\\U0097\\U00a5\\U00e6\\U009c\\U00ac" 2print(utf8) 3//=> \U00e6\U0097\U00a5\U00e6\U009c\U00ac 4 5let unicodes = utf8.components(separatedBy: "\\U") 6 .filter {!$0.isEmpty} 7 .map {UInt8($0, radix: 16) ?? 0} 8print(unicodes) 9//=> [230, 151, 165, 230, 156, 172] 10 11let str = String(bytes: unicodes, encoding: .utf8) ?? "(error)" 12print(str) 13//=> 日本

投稿2017/06/06 05:56

編集2017/06/06 06:08
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

apple2

2017/06/06 06:48

ありがとうございます こんな感じの変換を求めていました しかしながら print(unicodes)のところで Expression implicitly coerced from '[Uint8]?' to Any let strのところで Value of optional type '[Uint8]?' not unwrapped: did you mean to use '!' or '??' っというエラーがでます それと最初の行なんですが 最初に取得した文字列の \U を \\U に置換するのでしょうか?
fuzzball

2017/06/06 06:59

let unicodes: [UInt8] = ... にするとどうなりますか?直らないようなら元に戻して print(type(of: unicodes)) の出力を教えて下さい。 >>最初に取得した文字列の \U を \\U に置換するのでしょうか? 置換は不要です。 printの出力結果を見てもらえば分かると思うのですが、"\\" で 一文字の \ になります。 メタ文字とか特殊文字とかエスケープとかでググると何か見つかるかもしれません。
apple2

2017/06/06 08:27

できました!! いつも根気よくお付き合いいただいて感謝しています ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問