|
| 1 | +pub fn encode(input: &str) -> String { |
| 2 | + let mut encoded = String::new(); |
| 3 | + |
| 4 | + for byte in input.bytes() { |
| 5 | + match byte { |
| 6 | + b'A'..=b'Z' | b'a'..=b'z' | b'0'..=b'9' | b'-' | b'_' | b'.' | b'~' => { |
| 7 | + encoded.push(byte as char); |
| 8 | + } |
| 9 | + // 他の文字は %XX の形式でエンコード |
| 10 | + _ => encoded.push_str(&format!("%{:02X}", byte)), |
| 11 | + } |
| 12 | + } |
| 13 | + |
| 14 | + encoded |
| 15 | +} |
| 16 | + |
| 17 | +#[cfg(test)] |
| 18 | +mod tests { |
| 19 | + use super::*; |
| 20 | + |
| 21 | + #[test] |
| 22 | + fn test_encode() { |
| 23 | + assert_eq!(encode("abc"), "abc"); |
| 24 | + assert_eq!(encode("あいう"), "%E3%81%82%E3%81%84%E3%81%86"); |
| 25 | + assert_eq!(encode("a b c"), "a%20b%20c"); |
| 26 | + assert_eq!(encode("a+b+c"), "a%2Bb%2Bc"); |
| 27 | + assert_eq!(encode("a=b=c"), "a%3Db%3Dc"); |
| 28 | + assert_eq!(encode("a:b:c"), "a%3Ab%3Ac"); |
| 29 | + assert_eq!(encode("a~b~c"), "a~b~c"); |
| 30 | + assert_eq!(encode("a!b!c"), "a%21b%21c"); |
| 31 | + assert_eq!(encode("a*b*c"), "a%2Ab%2Ac"); |
| 32 | + assert_eq!(encode("a'b'c"), "a%27b%27c"); |
| 33 | + assert_eq!(encode("a(c)c"), "a%28c%29c"); |
| 34 | + assert_eq!(encode("a)c)c"), "a%29c%29c"); |
| 35 | + assert_eq!(encode("a;c;c"), "a%3Bc%3Bc"); |
| 36 | + assert_eq!(encode("a:c:c"), "a%3Ac%3Ac"); |
| 37 | + assert_eq!(encode("a,d,c"), "a%2Cd%2Cc"); |
| 38 | + assert_eq!(encode("a/d/c"), "a%2Fd%2Fc"); |
| 39 | + assert_eq!(encode("a\\d\\c"), "a%5Cd%5Cc"); |
| 40 | + assert_eq!(encode("a?d?c"), "a%3Fd%3Fc"); |
| 41 | + assert_eq!(encode("a#d#c"), "a%23d%23c"); |
| 42 | + assert_eq!(encode("a&d&c"), "a%26d%26c"); |
| 43 | + assert_eq!(encode("a=d=c"), "a%3Dd%3Dc"); |
| 44 | + assert_eq!(encode("a@d@c"), "a%40d%40c"); |
| 45 | + assert_eq!(encode("a$d$c"), "a%24d%24c"); |
| 46 | + assert_eq!(encode("a`d`c"), "a%60d%60c"); |
| 47 | + } |
| 48 | +} |
0 commit comments