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^)/
コメント