AndroidとiOSでサーバー経由で文字列をやり取りした際の対応

Other Kotlin
Other

AndroidとiOSのアプリを作っていた際に、最初いけてると思ったが、問題がある事に気付いて対応した内容です。

使用している言語

Swift
Kotlin

絵文字と文字列は送れていたが、改行が含まれると表示されていなかった

AndroidとiOSで、サーバーを経由して文字列をやり取りする際に、Base64の文字列のデータとして、やり取りをするようにしていました。
パッと見、正常に表示されていると思っていましたが、改行を含めた文字列だと正しくデコードされていませんでした。

その時のiOS側のコード

func encode() -> String {
    let data = self.data(using: .nonLossyASCII, allowLossyConversion: true)!
    return String(data: data, encoding: .utf8) ?? ""
}
func decode() -> String {
    let data = self.data(using: .utf8)!
    return String(data: data, encoding: .nonLossyASCII) ?? ""
}

Androidのコード

fun String.decode(): String {
    val data: ByteArray = this.toByteArray(Charsets.UTF_8)
    return StringEscapeUtils.unescapeJava(String(data, Charsets.UTF_8))
}
fun String.encode(): String {
    val data: ByteArray = this.toByteArray(Charsets.UTF_8)
    return StringEscapeUtils.escapeJava(String(data, Charsets.UTF_8))
}

このようなコードで実装していましたが、iOS間のやり取りでは問題ないのですが、Androidからの文字列をデコードした際に、問題が起き、対応が必要でした。

上記のような実装だと、Androidから送られた改行を含んだ文字列の場合、iOS側でデコードが失敗し、からの状態となっていました。

変更した内容(正しい対応かはわかりません・・・)

色々、色々試して・・・一応思った通りの表示がされたのが、下記の実装方法でした。
※正しいやり方かどうかわかりません。他に問題が起きるかもしませんが、現状いけてそう・・・

iOSのコード

func encode() -> String {
    let data = self.data(using: .utf16)!
    let base64 = data.base64EncodedString()
    return base64
}
func decode() -> String {
    let data = NSData(base64Encoded: self, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters) as? Data ?? Data()
    let text = NSString(data: data, encoding: String.Encoding.utf16.rawValue) as? String ?? ""
    return text
}

Androidのコード

fun String.decode(): String {
    try {
        val data = Base64.decode(this, Base64.DEFAULT)
        return String(data, Charsets.UTF_16)
    } catch (e:Exception) {
        return this
    }
}
fun String.encode(): String {
    val data: ByteArray = this.toByteArray(Charsets.UTF_16)
    return Base64.encodeToString(data, Base64.DEFAULT)
}

UTF-16を使用して、実装しました。
今のところ、問題は無さそうな気がします。

他に良い方法があれば、教えていただきたいです。m(_ _)m

やり方をググったりしていたのですが、中々思ってるやり方が出てきませんでした。
探し方が悪いのか?あまり皆さん困らない事なのか・・・

なんとか、思った通りの動作をしていそうだったので、これでいこうかと思ってます。\(^o^)/

コメント

タイトルとURLをコピーしました