From e7ed3be525038c49c4e94bd285d09a7d834e8299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Andr=C3=A9e?= Date: Mon, 27 Aug 2012 02:31:14 +0200 Subject: [PATCH] UTF-8 for the love of celestia --- ponysay | 34 +++++++++++++++++++++------------- ponysay.pdf | Bin 397005 -> 397185 bytes 2 files changed, 21 insertions(+), 13 deletions(-) diff --git a/ponysay b/ponysay index bf353a0..1efa018 100755 --- a/ponysay +++ b/ponysay @@ -36,6 +36,14 @@ The version of ponysay VERSION = 'dev' # this line should not be edited, it is fixed by the build system + +''' +Hack to enforce UTF-8 in output (in the future, if you see anypony not using utf-8 in programs by default, report them to Princess Celestia so she can banish them to the moon) +''' +def print(text, end = '\n'): + sys.stdout.buffer.write((text + end).encode('utf-8')) + + ''' This is the mane class of ponysay ''' @@ -111,8 +119,8 @@ class Ponysay(): if os.path.isfile(ucsmap): mapfile = None try: - mapfile = open(ucsmap, 'r') - maplines += [line.replace('\n', '') for line in mapfile.readlines()] + mapfile = open(ucsmap, 'rb') + maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')] finally: if mapfile is not None: mapfile.close() @@ -154,8 +162,8 @@ class Ponysay(): if os.path.isfile(ucsmap): mapfile = None try: - mapfile = open(ucsmap, 'r') - maplines += [line.replace('\n', '') for line in mapfile.readlines()] + mapfile = open(ucsmap, 'rb') + maplines += [line.replace('\n', '') for line in mapfile.read().decode('utf8', 'replace').split('\n')] finally: if mapfile is not None: mapfile.close() @@ -517,8 +525,8 @@ class Ponysay(): balloonstream = None try: - balloonstream = open(balloonfile, 'r') - data = [line.replace('\n', '') for line in balloonstream.readlines()] + balloonstream = open(balloonfile, 'rb') + data = [line.replace('\n', '') for line in balloonstream.read().decode('utf8', 'replace').split('\n')] finally: if balloonstream is not None: balloonstream.close() @@ -627,7 +635,7 @@ class Ponysay(): for line in output.split('\n')[: lines]: print(line) else: - print(output); + print(output) ''' @@ -655,8 +663,8 @@ class Ponysay(): pair = pairs[random.randrange(0, len(pairs))] qfile = None try: - qfile = open(pair[1], 'r') - args.message = '\n'.join(qfile.readlines()).strip() + qfile = open(pair[1], 'rb') + args.message = qfile.read().decode('utf8', 'replace').strip() finally: if qfile is not None: qfile.close() @@ -727,8 +735,8 @@ class Ponysay(): else: cachev = None try: - cachev = open(cachedir + '/.version', 'r') - if ''.join(cachev.readlines()) == KMS_VERSION: + cachev = open(cachedir + '/.version', 'rb') + if cachev.read().decode('utf8', 'replace').replace('\n', '') == KMS_VERSION: newversion = True finally: if cachev is not None: @@ -1149,8 +1157,8 @@ class Backend(): def __loadFile(self): ponystream = None try: - ponystream = open(self.ponyfile, 'r') - self.pony = ''.join(ponystream.readlines()) + ponystream = open(self.ponyfile, 'rb') + self.pony = ponystream.read().decode('utf8', 'replace') finally: if ponystream is not None: ponystream.close() diff --git a/ponysay.pdf b/ponysay.pdf index 30f424084e214a4601515ea7155453e225443fc7..269fcedc7131ac89283416c33e863f71117a61c3 100644 GIT binary patch delta 8201 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 R<7KPii=xFoTtq@pM_ Tjmy~5#KP2&OI6j?-;E0ZiMnP< delta 7974 zcmZpiFL8FRM8g(F{Vpami|K`ej2iVvBfa}?n+fcDzy5=+k-)`8E_=D&EcJ}u@oL4&k>y0bgufEZLe%I`_cij2A z3LN!wzAWE)I^xBjI8&qBZ@aRXADeX4w*UIPU;f{Y-%l6b*Z$%xwCRD<(Op-?GoHI2 z;huTzo%|h9G1tegj31dMtPayVFF$WQncH)wXPxCt;>DlDA!0oE_-Dtl03oFnfL3@%hd3be`*#Zp!kTTf6O{ zOTNT0m8Q2sLaHA_%?{n$wDw1BimA~87KS-elFfw|-@2_@dvMOFFOIsqQ%@e9R;&Bu z+THF|56=Ewl>5qc^VzI@4HKCwiWa8lO#4;m&~##cgxBJhBP;83R&}Q3@|dg+4O_p3 z)jy&4$&2MuQA_3SoUe~9Saj>>+J78&hVh?e9hOWNjmj}o*rt^=L-gxI%Ldhp>aRD8 zSH1sfm0d10>r2~=fD@jT7QAuxnMe7}djA$Q&3~_$_weWsPs^_F(+iwuEPWT>CHrOr z>v0YKOpcq~0{e`9{FuCE^JRs;Wor%80m$$}r3JGupXOiTX|#AJPj=jYkK zH!R=OIV4r2#%$dwsw|wN>8>Pt4rdwRVSfXJ}YlF`Iq$ zl(#<=7U|pebqTImx9M+rr{P5}^L%Mduj%3a@BT43Pu+TrOETcUNpsM7=2!DmF4*s! zGbQNQyLBJ(j&bW`1$A+@mQ^<GT{lNr4-^Uu#Ne!^8C=ymw@xr4_3_g>FG@G5Y}>>q}6tFEvoeN|ij;4wEJ z^O-{yza0O0>3t8a>0Mva#plfNKU{ue?b+)`CqGiV9cQSllXAXemI|l!Lxy0MhM1H- z^~a)#YNmk)E49B**iqK1J6DN5QFuDdd(92+YF6GvlU*Bk*#&4EFg(8d^RWx5^9$Hqj#Y|gd&jQm zRP3B{!r-vd>T~sVG7PuB{)?J(>DKXQUwl{+d?fZ;RZVk!+N5cf=zRQ?Z-MdWW$VRx zwtYS?FnQk1Cxz>Am)zi53lRO413OYjWS_)q9x~-s8Qv-}=jM z(XC=pCUbpOvO8FK6i&T#Z=*9?!r6Ij5o>ysR_tn>H!)hIOSi+KcGt$uXMGkMy`J!t z$>2iGzMQ3U>=SF2%D*YN>NQt})m`~D)3nZA8&_U;IJo(BmvOE0gUXF&4+Be7-&Wl@ zt`U@V<=Kt3*%$97G~TN`8@|1zzE>-<{XpPd?f5Tw*21RwF450xVrJYcQTU{DU+T2n z=BkCew(kv%tG%;Xrg^vavi*TlF(2KuKIgc(9y~IyFGuFj}EeCM#(fSR?1q<8+mHZ+B%VIvS+M*bl-jvw((K@ zt9>fmQ&$$Q=r=U~s{H(~#omo3EbBwNiV9u^J*`-$9FG%<+n*#X4C$0?&MnbQkwI$*XO;8*UP`zk2r0X8}p&E8m~9HsSXanVx-D zXsPtKqf!6!zD`zJd_GJgs^xy;9DyZ$iF+0^{Hi}tym4ihTjaY|hLg+QE?V}o?Tz@F z1ImZ9GxWZ-Pv876dbUD`%{BY8bGTIP)edfuPGgT&b!ue(^@GJ{I>*wj4*U=0E{1

*VkE=PyIBv-1V+XyzUb>FPgrcV_l$J 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