akka-httpでtxtファイルをアップロードをする際、UTF8 with BOMなファイルがアップロードされた時にBOMを取り除いて文字列を復元したい。
ざっと探した感じうまく見つからず。
ただ、alpakkaにCSVを処理するライブラリがあって、そこに
The parser accepts Byte Order Mark (BOM) for UTF-8
とあるのでこのライブラリのコードを読めば出来そう。
で、参考にやってみて無事出来ました。
akka-httpというより実質、akka-stream。
val ByteOrderMark = ByteString.apply(0xEF.toByte, 0xBB.toByte, 0xBF.toByte)
def route =
extractRequestContext { ctx =>
implicit val materializer = ctx.materializer
fileUpload("file") {
case (metadata, byteSource) =>
var firstLine = true
val linesF: Future[Seq[String]] =
byteSource
.via(Framing.delimiter(ByteString("\n"), 1024), allowTruncation = true)
.map { bs =>
val bs2 = if (firstLine && bs.startsWith(ByteOrderMark)) bs.drop(3) else bs
if (firstLine) firstLine = false
bs2.decodeString("UTF-8")
}
.runFold(Seq.empty[String]) { case (acc, elem) => acc :+ elem }
....略...