Kiedyś napisałem sobie coś takiego:
[code]def make_url(p_str)
str = String.new(p_str)
str.strip!
s = ['ą', 'ć', 'ę', 'ł', 'ń', 'ó', 'ś', 'ż', 'ź',
'Ą', 'Ć', 'Ę', 'Ł', 'Ń', 'Ó', 'Ś', 'Ż', 'Ź',
'é', 'à', ' - ', 'À', 'Á', 'Ã', 'Ä', 'Å',
'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î',
'Ï', 'Đ', 'Ñ', 'Ô', 'Õ', 'Ö', 'Ù', 'Û', 'Ý',
'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç',
'è', 'é', 'ê', 'ë', 'ì', 'í', 'í', 'î', 'ï',
'ñ', 'ò', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü',
'ý', 'ÿ', '€', '$', 'Š', 'š', 'ž', 'Œ', 'œ',
'Ÿ', '§', '@' ]
r = ['a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z',
'a', 'c', 'e', 'l', 'n', 'o', 's', 'z', 'z',
'e', 'a', '-', 'a', 'a', 'a', 'a', 'a',
'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i',
'i', 'd', 'n', 'o', 'o', 'o', 'u', 'u', 'y',
'b', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c',
'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'i',
'n', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u',
'y', 'y', 'e', 's', 's', 's', 'z', 'oe', 'oe',
'y', 'p', 'at' ]
s.each_index {|i| str.gsub!(s[i], r[i])}
str.downcase!
str.gsub!(Regexp.new('\ +'), '-')
str.gsub!(Regexp.new('[^A-z0-9\-]'), '')
str.gsub!(Regexp.new('\-+', '-'), '-')
str
end[/code]
Konwertuje do URL w postaci takiej, jak piszesz (nie dodaje .html). Nie jest pewnie optymalna, bo to pochodzi z mojej pierwszej aplikacji w RoR, ale działa i sprytnie zamienia polskie literki i niektóre inne akcenty na ich odpowiedniki niekacentowane. Sam jestem ciekaw, czy ktoś dysponuje inną implementacją.