On Sat, 2008-04-19 at 11:48 +0200, Klaus Schmidinger wrote: > On 04/16/08 14:45, Matthias Schwarzott wrote: > > On Mittwoch, 16. April 2008, Soeren Sonnenburg wrote: > >> Dear List, > >> > >> I am desperately trying to get the german umlauts going for both vdr > >> receiving EPG information (out of the air directly from the channels...) > >> and via epg4vdr 0.5 > >> http://www.wontorra.net/article.php?story=20050429181815661 > >> > >> I've noticed that standard EPG has the correct encoding, but only the > >> one from epg4vdr has not. However the pulled .xml files still have the > >> right (i.e. utf-8) encoding. > >> > >> Only when this information is transferred to vdr (I guess via SVDRP) > >> umlauts and everything is distorted. Also then the dumped epgdata file > >> contains wrongly encoded parts... > >> > >> Any ideas what I could do about this? > >> > > I guess you need to know the encoding your vdr runs with, and then use this > > for the SVDRP connection. > > > > > > For future VDR development I still think it could be useful to: > > 1. Either add a header for epg data (and other places where vdr exchanges > > texts) telling the encoding. > > The only reasonable thing IMO would be to make an SVDRP command (or extend an > existing one) that tells which encoding is used by this VDR. Maybe an extended > signon message would be ok, like > > 220 video SVDRP VideoDiskRecorder 1.7.1; Sat Apr 19 11:43:27 2008; ISO-8859-1 > > I wouldn't like to fiddle around with headers in many places. That sounds like a good solution. Regarding the specific epg4vdr problem: it was sufficient to a) put the locale to some utf8 locale b) extract the epg4vdr archive and change the occurance of iso8859 to utf8 for writng the xml file Otherwise utf8 is erraneously read as iso8859-1. Also as a workaround I wrote a small proxy that does this translation on the fly (attached). Soeren
#!/usr/bin/env python import SocketServer import socket import os import time src=('localhost', 2002) dst=("localhost", 2001) linelen=100 overflow=dict() def read_line(f, who): if not overflow.has_key(f): overflow[f]='' s=overflow[f] while True: i=s.find('\n') if i>-1: data=s[:(i+1)] overflow[f]=s[(i+1):] break d=f.recv(1024) if not d: data=s overflow[f]='' break s+=d l=len(data) #print '<-- %s: %d %s' % (who, l, data) return data def write_line(f, data, who): f.sendall(data) l=len(data) #print '--> %s: %d %s' % (who, l, data) class MyClientHandler(SocketServer.BaseRequestHandler): def handle(self): #print "connect from: " + `self.client_address` epg=self.request vdr=socket.socket(socket.AF_INET, socket.SOCK_STREAM) vdr.connect(dst) # connecting to vdr while 1: try: data = read_line(vdr, "vdr") if not data: break write_line(epg, data, "epg4vdr") if data.startswith('354'): #print "sending EPG to vdr" sending=True while sending: data = read_line(epg, "epg4vdr") if not data or data=='.\n': data='.\n' sending=False cvt=data.decode('utf-8', 'ignore').encode('iso8859-1','ignore') write_line(vdr, cvt, "vdr") #print "--> vdr : epgs done" else: data = read_line(epg, "epg4vdr") if not data: break #print(u'' + data.decode('utf-8').encode('iso8859-1').decode('utf-8')) #print data.decode('utf-8').encode('iso8859-1','ignore') #print data.encode('utf-8') #print data.decode('utf-8') #cvt=data.decode('utf-8', 'ignore').encode('iso8859-1','ignore') write_line(vdr, data, "vdr") except KeyboardInterrupt: break vdr.shutdown(socket.SHUT_RDWR) vdr.close() epg.close() # make a threaded server, listen/handle clients forever try: server = SocketServer.TCPServer(src, MyClientHandler) server.serve_forever() except KeyboardInterrupt: server.server_close()
_______________________________________________ vdr mailing list vdr@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr