【Swift】EUC-JPでURLエンコーディングする


はじめに

クエリを含むURLを作成したい時には、URLエンコーディングを行う必要があると思います。
EUC-JPでエンコードする記事はあまり見かけないのでまとめます。(今どき、EUC-JP使っているサーバーなんてほぼないと思いますが。。。)
ご参考になればと思います!

実装してみる

今回は String の Extension で実装します。

import Foundation

extension String {
    var encodedByEUCJP: String {
        // エンコーディングしない文字列をキャラクタセットとして定義
        let allowedCharacters = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~")

        // エンコーディングを定義する
        let eucjpEncoding = String.Encoding(rawValue:CFStringConvertEncodingToNSStringEncoding(CFStringEncoding(CFStringEncodings.EUC_JP.rawValue)))

        // Data型にする
        let data = self.data(using: eucjpEncoding, allowLossyConversion: true) ?? Data()

        // URLエンコードしていく
        let urlEncoded = data.map { byte -> String in
            if allowedCharacters.contains(UnicodeScalar(byte)) {
                return String(UnicodeScalar(byte))
            } else if byte == UInt8(ascii: " ") {
                return "+"
            } else {
                return String(format: "%%%02X", byte)
            }
        }.joined()
        return urlEncoded
    }
}

試してみる

無事、EUC-JPでURLエンコーディングできました!

print("テスト".encodedByEUCJP)    // %A5%C6%A5%B9%A5%C8