UDP Client und UTF-8

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

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
Zuletzt geändert von Anonymous am Montag 26. August 2013, 15:45, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
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.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

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)
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.
audacity363
User
Beiträge: 83
Registriert: Dienstag 6. August 2013, 18:59

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.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

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?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

'\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.
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.
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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

manche Kommentare kommen mir auch nur wie Chinesisch vor. :lol:
Antworten