Rustで簡単に全角英数を半角英数に変換する方法をメモ。
charとusizeをうまく変換するのが大切。
Rustで文字1文字を文字コードで表現するには、'\u{xxxx}'のように記述します。
これを知っていれば手軽に変換処理が書けます。
zen2han.rs
/// 全角英数記号を半角英数記号に変換
pub fn zen2han(c: char) -> char {
match c {
// half ascii code
'\u{0020}'..='\u{007E}' => c,
// FullWidth
// '!'..='~' = '\u{FF01}'..='\u{FF5E}'
'\u{FF01}'..='\u{FF5E}' => char_from_u32(c as u32 - 0xFF01 + 0x21, c),
// space
'\u{2002}'..='\u{200B}' => ' ',
'\u{3000}' | '\u{FEFF}' => ' ',
// others
_ => c,
}
}
/// 半角英数記号を全角英数記号に変換
pub fn han2zen(c: char) -> char {
match c {
// digit
'0'..='9' => char_from_u32(c as u32 + 0xFF10 - 0x30, c),
// alphabet
'A'..='Z' | 'a'..='z' => char_from_u32(c as u32 + 0xFF21 - 0x41 , c),
// flag
'!'..='/' | ':'..='@' | '['..='`' | '{'..='~' =>
char_from_u32(c as u32 + 0xFF01 - 0x21, c),
_ => c
}
}
/// u32からcharに変換
pub fn char_from_u32(i: u32, def: char) -> char {
char::from_u32(i).unwrap_or(def)
}
上記をテストするコード
test.rs
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_zen2han() {
assert_eq!(zen2han('A'), 'A');
assert_eq!(zen2han('3'), '3');
assert_eq!(zen2han(' '), ' ');
}
#[test]
fn test_han2zen() {
assert_eq!(han2zen('A'), 'A');
assert_eq!(han2zen('3'), '3');
assert_eq!(han2zen('!'), '!');
}
}