Python - ROT13 encode
"ROT13 ("rotate by 13 places", sometimes hyphenated ROT-13) is a simple letter substitution cipher that replaces a letter with the letter 13 letters after it in the alphabet. ROT13 is an example of the Caesar cipher, developed in ancient Rome."
~Wikipedia.
Here are 2 solutions to implement ROT13 in Python:
0. 1st solution:
import string
ROT13 = string.maketrans(\
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",\
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
def rot13_encode(user_text):
return string.translate(user_text, ROT13)
This method works smoothly in the console but when using with the web it will raise error because of some special characters in the input:
The Unicode version of translate requires a mapping from Unicode ordinals (which you can retrieve for a single character with ord) to Unicode ordinals. If you want to delete characters, you map to None:
To fix that, use this function to translate those special characters before encoding:
1. 2nd solution, built-in string encode function:
def rot13_encode(user_text):
return user_text.encode("rot13")
That's why I love Python! <3
References:
[0] http://docs.python.org/2/library/codecs.html
[1] http://stackoverflow.com/questions/3269686/short-rot13-function
[2] http://stackoverflow.com/questions/10783141/google-app-engine-and-string-translate-doesnt-work
[3] http://en.wikipedia.org/wiki/ROT13
~Wikipedia.
Here are 2 solutions to implement ROT13 in Python:
0. 1st solution:
import string
ROT13 = string.maketrans(\
"ABCDEFGHIJKLMabcdefghijklmNOPQRSTUVWXYZnopqrstuvwxyz",\
"NOPQRSTUVWXYZnopqrstuvwxyzABCDEFGHIJKLMabcdefghijklm")
def rot13_encode(user_text):
return string.translate(user_text, ROT13)
This method works smoothly in the console but when using with the web it will raise error because of some special characters in the input:
File "/usr/lib/python27/string.py", line 498, in translate
return s.translate(table + s[:0])
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 128: ordinal not in range(128)
The Unicode version of translate requires a mapping from Unicode ordinals (which you can retrieve for a single character with ord) to Unicode ordinals. If you want to delete characters, you map to None:
To fix that, use this function to translate those special characters before encoding:
def translate_non_alphanumerics(to_translate, translate_to=u'_'):
not_letters_or_digits = u'!"#%\'()*+,-./:;<=>?@[\]^_`{|}~'
translate_table = dict((ord(char), translate_to) for char in not_letters_or_digits)
return to_translate.translate(translate_table)
1. 2nd solution, built-in string encode function:
def rot13_encode(user_text):
return user_text.encode("rot13")
That's why I love Python! <3
References:
[0] http://docs.python.org/2/library/codecs.html
[1] http://stackoverflow.com/questions/3269686/short-rot13-function
[2] http://stackoverflow.com/questions/10783141/google-app-engine-and-string-translate-doesnt-work
[3] http://en.wikipedia.org/wiki/ROT13
Comments
Post a Comment