UTF文字列の送受信

MusicBee Wifi Syncの開発で、ほぼ同時期に二つの要望、報告があった。絵文字によるファイル名の使用と、エラーログにUTFDataFormatExceptionが出ているというものだった。

元々、文字列の送受信は、オリジナルの時から、DataInput.readUTF(), DataOutput.writeUTF(String)を使っていた。このうち、readUTF()のソースを流し読みしたのであるが、バイト毎に処理をしていて、修正UTF-8の定義に基づいた判定をしていた。

しかし、どういうわけか、この判定がうまくいかないパターンがあったようなのであった。顕著な例が絵文字ファイル名であり、Stringでいる間は値を保持できるのにPCとの間で送受信ができないのである。

そこで、これらのメソッドを使わずに、自作することにした。やっていることは単純で、送受信対象のStringをByteArrayに変換したときの配列長をShort型(2バイト、16bit)で送り、その後にByteArrayを送受信する。UTF-8を指定して。これだけのことである。最初は修正UTF-8のビット判定をいれていたのであるが、省略した。おかしいなら他がおかしいのだろうという考えである。

そして、これらはうまく動いている。速度的にも上がったように感じる。最初、受信側だけ実装して、送信側の実装をしていなかったので、非対称な状態になってMusicBeeに疑いをかけてしまったのは本当に作者に申し訳ないことをしたと思っているが、送信側の実装を終えて、問題なく動いている。

また、この形で受信した絵文字ファイル名を持つファイルはファイラーや音楽プレイヤーで問題なく扱え、私のアプリの売りのリバースシンクも問題なく行えた。

ライブラリのバグなのか、厳密なところが悪さをしているのかは、そこまで追いかけていないのでわからない。ただ、私のアプリではこれでうまくいった、ということである。

コメント