Seite 1 von 1

UDP Client und UTF-8

Verfasst: Montag 26. August 2013, 14:58
von audacity363
Guten Tag
Kurz am Anfang was das ganze Programm macht:
Eine UDP Client soll sich Daten von einem Arduino Server holen und diese dann weiter verarbeiten wie z.B. An einen Server weitergeben der auf eine Android App hört. Ebenfalls wird dadurch Ventilator, Rolladen usw. im Zimmer gesteuert.

Jetzt zu meinem Problem: Da man bei einem UDP Socket keine Strings versenden kann muss das ganze ja mit

Code: Alles auswählen

 bytes(message, 'UTF-8')
konvertiert werden. Zu test Zwecken habe ich mir einen kleinen Client geschrieben der Nachher im Hauptprogramm laufen soll. Dieser Client dient dazu das die Daten vom Arduino abgeholt werden:

Code: Alles auswählen

import socket   #for sockets
import sys  #for exit
import time 
 
# create dgram udp socket
try:
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
except socket.error:
    print ('Failed to create socket')
    sys.exit()
 
host = "192.168.178.91"
port = 8888
 
while(1) :
    msg = "stat"
     
    try :
        #Set the whole string
        print("sende String")
        s.sendto(bytes(msg, 'UTF-8'), (host, port))
        print("String gesendet")
        # receive data from client (data, addr)
        print("Warte auf eingang")
        d = s.recvfrom(1024)
        reply = d[0]
        
         
        print ('Server reply : ' + reply.decode("utf-8"))
     
    except socket.error:
        print ('Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
        sys.exit()
        
    time.sleep(2)

Wenn ich ihn so aus der Testdatei heraus starte funktioniert das ohne Probleme aber sobald ich das ganze ins Hauptprogramm implementiere kommt folgende Fehlermdelung:
SyntaxError: Non-UTF-8 code starting with '\xe4' in file I:\Programmieren\Phyton\Raspberrypi\Main.py on line 38, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details


Die Website hilft mir nicht wirklich weiter.
Das Hauptprogramm sieht so aus:

Code: Alles auswählen

'''
Created on 20.08.2013

@author: Tom
'''
#!/usr/bin/python
import sys, os
from socket import *
import time
import threading
import Arduino
import Rolladen
import Android

Arduino_status = False
Rolladen_status = False #False = oben True = unten
Ventilator_status = False #False = aus True = an
exit = False
infos_raw = ""
infos_array = {}
infos = ""
host = "192.168.178.91"
port = 8888

          
#if len(sys.argv) < 3:
#    sys.exit("Usage: Main.py XX/XX/XX XX/XX/XX")
    
zeit_morgen_string = sys.argv[1].split("/", 3)
zeit_abend_string = sys.argv[2].split("/", 3)



print("Connecting to Arduino")
#ping = Arduino.Ping()
#ping.start()
#ätime.sleep(3)
#if Arduino.Ping == False:
    #sys.exit("Arduino Server fehlt")
    
print("[OK] Verbindung zum Arduino aufgebaut")
print("Zeit Thread wird gestartet")
rolladen = Rolladen.Rolladen1(zeit_morgen_string, zeit_abend_string)
rolladen.start()
print("Android Server wird gestartet")
android = Android.Android_Server()
android.start()
while True:
    msg = "stat"
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    except socket.error:
        print ('Failed to create socket')
        sys.exit()
    try :
        #Set the whole string
        print("sende String")
        s.sendto(bytes(msg, 'UTF-8'), (host, port))
        print("String gesendet")
        # receive data from client (data, addr)
        print("Warte auf eingang")
        d = s.recvfrom(1024)
        reply = d[0]
        
         
        print ('Server reply : ' + reply.decode("utf-8"))
     
    except socket.error:
        print ('Error Code : ' + str(msg[0]) + ' Message ' + msg[1])
        sys.exit()

    Android.Temp = infos_array[0]
    Android.Licht = infos_array[1]
    Android.Rolladen_status = Rolladen_status
    Android.Ventilator_status = Ventilator_status
    time.sleep(2)
    if Android.main_exit:
        break

c = input()
Rolladen.exit = True
Arduino.exit = True
Android.exit = True

Re: UDP Client und UTF-8

Verfasst: Montag 26. August 2013, 15:55
von BlackJack
@audacity363: Wenn Du etwas ausserhalb von ASCII-Zeichen im Quelltext hast, wie in Zeile 38 die in der Fehlermeldung ja angegeben wird, dann muss im Quelltext die Kodierung des Quelltextes angegeben werden. So wie in dem PEP beschrieben welches ebenfalls in der Fehlermeldung als Link steht.

Re: UDP Client und UTF-8

Verfasst: Montag 26. August 2013, 16:26
von audacity363
Nur ist leider Zeile 38 ein Kommentar.

Code: Alles auswählen

#if Arduino.Ping == False:
Auch wird in der Test Datei (erster Quellcode) ohne Probleme ausgeführt. Das ist ja das was mich so wundert.
Auch wenn ich die ersten Beiden Zeilen hinzufüge:
#!/usr/bin/python
# -*- coding: <UTF-8> -*-
Funktioniert es nicht. (Wie denn auch sind ja Kommentare)

Re: UDP Client und UTF-8

Verfasst: Montag 26. August 2013, 16:32
von BlackJack
@audacity363: Zeile 38 eine Zeile höher als Du denkst. Und da steht ein 'ä', was ausserhalb von ASCII ist. Dass dieses 'ä' in einem Kommentar steht macht keinen Unterschied, der Compiler muss schliesslich den gesamten Quelltext dekodieren können, auch die Kommentare.

< und > werden in Dokumentation oft verwendet um Variable Teile in einem Text zu kennzeichnen und gehören nicht zum Inhalt. Schau Dir mal die Beispiele in dem PEP an.

Re: UDP Client und UTF-8

Verfasst: Montag 26. August 2013, 16:37
von audacity363
OHHHHHHH Gott ich bin ein ziemlicher Idiot. Das ganze hat sich irgendwie da eingeschlichen. Habe mir die Kommentare gar nicht richtig angesehen weil ich halt gedacht habe die werden gar nicht beachtet.

Re: UDP Client und UTF-8

Verfasst: Dienstag 27. August 2013, 04:19
von Hellstorm
BlackJack hat geschrieben:@audacity363: Wenn Du etwas ausserhalb von ASCII-Zeichen im Quelltext hast, wie in Zeile 38 die in der Fehlermeldung ja angegeben wird, dann muss im Quelltext die Kodierung des Quelltextes angegeben werden. So wie in dem PEP beschrieben welches ebenfalls in der Fehlermeldung als Link steht.
Das verwundert mich aber.

Zum einen benutzt er Python 3 („print("sende String")“), bei dem UTF-8 Standard ist. Da kann man normalerweise einfach folgendes Programm schreiben:

Code: Alles auswählen

print("Москва́")
Keine Angabe von Kodierung erforderlich.

Zum anderen sind Kommentare doch normalerweise völlig egal (Wie es in Python ist, weiß ich allerdings zugegebenermaßen nicht). Die werden doch vom Compiler/Interpreter ignoriert.

Ich habe schon C- und Visual-Basic-Quelltexte gesehen, wo die ganzen Kommentare auf Chinesisch waren.

Wieso meckert der dann hier? Oder liegt das daran, dass ich normalerweise ein BOM am Anfang setze?

Re: UDP Client und UTF-8

Verfasst: Dienstag 27. August 2013, 06:18
von Sirius3
'\xe4' ist kein gültiges UTF8 sondern die latin-1-Codierung des 'ä'. Ohne die Kodierung zu kennen, kann man nicht einmal mit Sicherheit sagen, wo eine Zeile endet. Wie soll dann Python erraten können, was zu einem Kommentar gehört? Dass andere Sprachen solche Tatsachen ignorieren sagt eher etwas über deren Verständnis von Zeichenkodierung aus.

Re: UDP Client und UTF-8

Verfasst: Dienstag 27. August 2013, 07:52
von BlackJack
@Hellstorm: Auf die Python-Version hatte ich nicht geachtet.

Der erste Schritt ist es den gesamten Quelltext in Unicode zu dekodieren. Danach wird das erst syntaktisch interpretiert. Finde ich auch sinnvoll, denn wenn die Kommentare falsch kodiert sind, dann ist das letztendlich ja auch ein Fehler im Quelltext.

Re: UDP Client und UTF-8

Verfasst: Dienstag 27. August 2013, 09:26
von lunar
@Hellstorm C und Visual Basic kümmern sich nicht um die Kodierung des Quelltexts. Ein Kommentar beginnt mit der Bytefolge '0x2F2F' bzw. '0x3B', und endet mit '0x0A'. Welche Bytes dazwischen kommen, ist dem Compiler egal.

Genau genommen stehen in einem C-Quelltext also nie chinesische Kommentare, sondern allenfalls Kommentare, die chinesisch aussehen, wenn man sie zufällig mit der richtigen Kodierung betrachtet.

Re: UDP Client und UTF-8

Verfasst: Dienstag 27. August 2013, 10:58
von Sirius3
manche Kommentare kommen mir auch nur wie Chinesisch vor. :lol: