Since I got my first year badge I decided to celebrate by listing my achievements and writing one of the most useless applications I've ever written.
achievements
- > 20.000 views...pretty neat! nearly 60 per day
- > 2500 followers ...again nice! that's nearly 7 per day
- 2.5 years on the same job.
application
This amazing application as the title states prints all utf8 characters that can be printed. The star on the title is that I limited the output to the first 3 bytes.
ENJOY
Our main function has 3 loops
- one for the single byte chars 0000 - 007F
- one for the two byte chars 00C0 - 00DF | 0080 - 00BF
- one for the three byte chars 00E0 - 00EF | 0080 - 00BF | 0080 - 00BF
use std::num::ParseIntError; use std::str; fn main() { let mut char_index = 0; let one_byte = vec![0, 127]; for i in one_byte[0]..one_byte[1] { let mut first = format!("{:X}", i); first = make_even(first); char_index = output(first, char_index); } let two_bytes = vec![192, 223, 64, 191]; for i in two_bytes[0]..two_bytes[1] { for j in two_bytes[2]..two_bytes[3] { let mut first = format!("{:X}", i); let mut second = format!("{:X}", j); first = make_even(first); second = make_even(second); char_index = output(first.to_string() + &second.to_string(), char_index); } } let three_bytes = vec![224, 239, 64, 191, 64, 191]; for i in three_bytes[0]..three_bytes[1] { for j in three_bytes[2]..three_bytes[3] { for k in three_bytes[4]..three_bytes[5] { let mut first = format!("{:X}", i); let mut second = format!("{:X}", j); let mut third = format!("{:X}", k); first = make_even(first); second = make_even(second); third = make_even(third); char_index = output( first.to_string() + &second.to_string() + &third.to_string(), char_index, ); } } } } Hex string needs an even amount of characters
pub fn make_even(mut s: String) -> String { if s.len() % 2 == 1 { s = "0".to_string() + &s.to_string(); } return s; } I got this function from here. What it basically does is, it converts a hex string to a u8 array.
pub fn decode_hex(s: &str) -> Result<Vec<u8>, ParseIntError> { (0..s.len()) .step_by(2) .map(|i| u8::from_str_radix(&s[i..i + 2], 16)) .collect() } Nested matches for the win. Checks :
- if the hex string is valid
- if the character is valid in utf-8
- if the character has a printable representation (by looking the printed output length)
pub fn output(hex: String, mut i: i32) -> i32 { match &decode_hex(&hex) { Ok(dh) => match str::from_utf8(dh) { Ok(v) => { if format!("{:?}", v).len() < 7 { if i % 10 == 0 { println!("{:?} {:?} \t", hex, v); } else { print!("{:?} {:?} \t", hex, v); } i += 1; } } _ => {} }, _ => {} } return i; }

Top comments (0)