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

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

ただいまの
回答率

90.46%

  • Swift

    8993questions

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

  • Xcode

    5066questions

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

  • Node.js

    2431questions

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

  • Socket.IO

    221questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,078

apple2

score 29

node.jsサーバとのやりとりですが、日本語が送受信できません

まず受信した日本語がうまく表示できません
webから取得した文字列は下記のように表示されます
\U00e6\U0097\U00a5\U00e6\U009c\U00ac
本当は"日本"になるはずです
nodeサーバ側からの送信は

var msg = new Object();
msg.cmd = '日本';
io.sockets.json.emit('messageHeat',  { value: msg });
    });

iOS側はこんな感じで受信しています

socket = SocketIOClient(socketURL: URL(string: "192.168.1.100")!, config: [.log(false), .forcePolling(true)])

socket.on("Message") { data, emitter in
let mes = String(describing: data)
let msgcmd = //ここでパースしてmsg.cmdを取り出します
self.myTextfield( str: msgcmd)

  }
socket.connect()

送信するときもうまく送信できません
文字コードを変換する必要があると思うのですが
どうやればいいのでしょう

        let post = "日本"
        socket.emit("message",post)
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • apple2

    2017/06/06 09:44

    そう思います

    キャンセル

  • fuzzball

    2017/06/06 09:53 編集

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

    キャンセル

  • apple2

    2017/06/06 09:56

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

    キャンセル

回答 2

checkベストアンサー

0

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

let utf8 = "\\U00e6\\U0097\\U00a5\\U00e6\\U009c\\U00ac"
print(utf8)
//=> \U00e6\U0097\U00a5\U00e6\U009c\U00ac

let unicodes = utf8.components(separatedBy: "\\U")
                   .filter {!$0.isEmpty}
                   .map {UInt8($0, radix: 16) ?? 0}
print(unicodes)
//=> [230, 151, 165, 230, 156, 172]

let str = String(bytes: unicodes, encoding: .utf8) ?? "(error)"
print(str)
//=> 日本

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/06 15: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 に置換するのでしょうか?

    キャンセル

  • 2017/06/06 15:59

    let unicodes: [UInt8] = ... にするとどうなりますか?直らないようなら元に戻して print(type(of: unicodes)) の出力を教えて下さい。

    >>最初に取得した文字列の \U を \\U に置換するのでしょうか?
    置換は不要です。
    printの出力結果を見てもらえば分かると思うのですが、"\\" で 一文字の \ になります。
    メタ文字とか特殊文字とかエスケープとかでググると何か見つかるかもしれません。

    キャンセル

  • 2017/06/06 17:27

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

    キャンセル

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Swift

    8993questions

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

  • Xcode

    5066questions

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

  • Node.js

    2431questions

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

  • Socket.IO

    221questions

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