Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Python: sfida a scrivere gli accenti (ma non solo)

    Salve, per giorni ho cercato di risolvere un unico problema: scrivere in python gli accenti di lingue straniere. Vi vedo già, pronti a scrivere la soluzione, o mandarmi a cercarla, pigrone che non sono altro...
    Ebbene no, tutti i consigli che ho trovato finora sono stati inutili, compreso quello di scrivere la riga
    # -*- coding: utf-8 -*-

    oppure quello di usare stringhe del tipo
    print u"string asdfs"

    Premetto che riesco a visualizzare gli accenti italiani ma a me serviva una cosa per correggere certi file in polacco, danneggiati. La riparazione consiste nella sostituzione dei caratteri:

    caratteriSbagliati = "¹æêñ³óœ¿Ÿ¥ÆÊÑ£ÓŒ¯" #vettore dei caratteri da sostituire
    caratteriAggiustati= "ąćęńłóśżźĄĆĘŃŁÓŚŻŹ" #vettore dei caratteri che rimpiazzeranno quelli sbagliati

    (*)

    Ricordando che una stringa in php è trattata come un vettore, per ogni carattere in un file mi basterebbe sostituire ogni caratteriSbagliati[i] con un caratteriAggiustati[i].

    Ma non riesco nemmeno a fare le seguenti istruzioni:
    print "¹æêñ³óœ¿Ÿ¥ÆÊÑ£ÓŒ¯"
    print "ąćęńłóśżźĄĆĘŃŁÓŚŻŹ"

    Dando un tale programma ai miei amici polacchi sarei una specie di eroe.

    Devo precisare che ho Windows Xp a 32 bit, e che forse il mio programma su Linux a 64 bit o Vista funzionerebbe, ma io lo vorrei portabile.

    Qualche sant'uomo o santa donna mi potrebbe aiutare, dicendomi come leggere/scrivere le lettere sopra indicate anche con XP?
    Grazie!

    (*) Trovare un file in polacco danneggiato è semplicissimo, andate su un sito di sottotitoli, scaricatene uno in polacco, al 99% non è in unicode quindi vedrete i caratteri che originano il mio problema.
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  2. #2
    # -*- coding: utf-8 -*-

    Questa strinfga ti codifica il testo in utf-8
    Credo che i caratteri polacchi usino un'altro standard.
    Quindi dovresti cambiare utf-8 con utf-999 (esempio)

  3. #3
    Originariamente inviato da Edd
    # -*- coding: utf-8 -*-

    Questa strinfga ti codifica il testo in utf-8
    Credo che i caratteri polacchi usino un'altro standard.
    Quindi dovresti cambiare utf-8 con utf-999 (esempio)
    Non credo proprio, UTF-8 è la codifica universale e vale per tutte le lingue, un'implementazione di Unicode.
    È stata fatta apposta, per non avere problemi di caratteri con nessuna lingua (vedi http://it.wikipedia.org/wiki/UTF-8 - tra l'altro uno standard per i siti web del W3C).

    Comunque come mi ricapita quel computer ci riprovo, ma a prima vista la soluzione dovrebbe essere un'altra.
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  4. #4
    Importanti novità:
    Stamattina ho fatto un bel po' di scoperte su Python, usando un computer a 64 bit con linux (per essere sicuro che il problema non fosse il sistema operativo). Eccovele servite:

    1. array e stringhe
    Non è vero ciò che molti corsi di Python dicono, ovvero che una stringa può essere trattata ESATTAMENTE come un vettore: le stringhe in UTF-8 possono occupare più di un byte, quindi segue che le due dichiarazioni seguenti sono diverse:
    codice:
    vettoreCaratteri= ['ą','ć','ę','ń','ł','ś','ż','ź','Ą','Ć','Ę','Ń','Ł','Ś','Ż','Ź']
    stringaCaratteri= "ąćęńłśżźĄĆĘŃŁŚŻŹ"
    Infatti, le seguenti espressioni
    codice:
    print stringaCaratteri[1]  // equivale a scrivere METÀ della lettera ć, (forse stamperà un '?') 
    print vettoreCaratteri[1]  // equivale a prendere LA lettera ć
    Con l'ormai antiquato ASCII, non c'era differenza tra vettore e stringa perché tutti i caratteri erano di un byte. Ma con UTF-8 la differenza c'è e va rispettata. Non so con UTF16 che ha una lunghezza fissa, ma di 2 byte, e al momento nemmeno mi interessa.

    2. Dichiarare le stringhe
    Per ora dichiarare la stringa anteponendo la u di Unicode non mi è servito a molto, del tipo:
    codice:
    stringaUnicode = u'€'
    mentre può servire se si fa uso dei caratteri in forma di codice:

    codice:
    print(u"\u20ac")  // Questo scriverà il simbolo € solo se c'è la u davanti le virgolette
    3. il mito di # -*- coding: utf-8 -*-
    La stringa iniziale:
    codice:
    # -*- coding: utf-8 -*-
    forse indica che il codice sorgente contiene caratteri Unicode, ma non ha molto a che fare con il resto del funzionamento del programma

    4. Se ci sono problemi con funzioni come print nel terminale MS Dos anche dopo aver sistemato tutto, forse è colpa del sistema operativo, della console di Python e non necessariamente del vostro programmino in Python.
    In tal caso, per risolvere i dubbi, si può inviare l'output su un file per vedere se le lettere accentate o i vostri ideogrammi cinesi sono scritti correttamente (i file unicode sono supportati anche dai vecchi sistemi operativi da parecchi anni, forse anche prima di Xp).

    ----
    Questa risposta è temporanea, devo adesso verificarla su un computer con XP per controllare che tutto funzioni bene anche là. Chi ha altre informazioni utili può aggiungerle.
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  5. #5

    Semi-soluzione

    Ho lo script, ma con un grave problema:
    tale script legge e sostituisce i caratteri correttamente solo se il file ORIGINALE è in UF-8, altrimenti crea un file ANSI, ovvero la stessa codifica del file originale, con i caratteri sbagliati.

    codice:
    # -*- coding: utf-8 -*-
    import tkFileDialog  
    
    def sostituisciCaratteri(sOriginale) :
        caratteriSbagliati = ['¹','æ','ê','ñ','³','œ','¿','Ÿ','¥','Æ','Ê','Ñ','£','Œ','¯',''] #vettore dei caratteri da sostituire
        caratteriAggiustati= ['ą','ć','ę','ń','ł','ś','ż','ź','Ą','Ć','Ę','Ń','Ł','Ś','Ż','Ź'] #vettore dei caratteri che rimpiazzeranno quelli sbagliati
        unicode(sOriginale,'utf-8')
        lunghezza = range(0,len(caratteriSbagliati))
        for i in lunghezza:
            sOriginale = sOriginale.replace(caratteriSbagliati[i], caratteriAggiustati[i])
        return sOriginale
    
    
    ## Prova
    fileOriginale = tkFileDialog.askopenfile(mode = 'r') #finestra per scegliere il file
    fileAggiustato = open(fileOriginale.name+"_n.txt",'w') #crea un nuovo file
    
    for line in fileOriginale.readlines():
        fileAggiustato.write(sostituisciCaratteri(line))
    Mi serve leggere dei caratteri da file in ANSI con righe del tipo:
    POSIAD£OŒÆ ALTHORP, ANGLIA KWIECIEÑ 1774 KSIʯNA,SZEŒÆ LAT PÓNIEJ

    Fare modifiche usando caratteri UTF-8 e quindi creare un file di destinazione, che esigo sia UTF-8 e contenga i caratteri corretti, del tipo:
    POSIADŁOŚĆ ALTHORP, ANGLIA KWIECIEŃ 1774 KSIĘŻNA,SZEŚĆ LAT PÓŹNIEJ

    Si tratta di partire da Ansi ed arrivare ad unicode, questo sembra essere il problema. Partire da unicode e restarci sembra facile.

    Ho provato
    fileAggiustato = open(fileOriginale.name+"_n.txt",'w','utf-8')
    ma mi dà errore.

    PS per far girare l'esempio occorrono le librerie Tkinter di python.
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  6. #6
    oppure quello di usare stringhe del tipo
    print u"string asdfs"
    good

  7. #7
    Originariamente inviato da caaraa
    oppure quello di usare stringhe del tipo
    print u"string asdfs"
    Non funziona. Esempio (nota, sono su winXP, uso un file utf-8):
    codice:
    print u"śę"
    genera il simpatico errore:

    print u"śę"
    File "C:\Python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
    UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <unde
    fined>
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  8. #8
    Trovato!!
    Il problema è la codifica. Leggendo e facendo ulteriori esperimenti, ho scoperto che
    questi file erano in origine nella codifica "windows-1250", ma i vari programmi non se ne accorgono e visualizzano il testo distorto.
    Il web è pieno di questi file di testo, a causa del fatto che utf-8 non è usato da molti programmi e gli utenti poverini non lo sanno.

    1. Cambiando la codifica il file viene visualizzato correttamente, quindi la sostituzione che facevo non è necessaria. Purtroppo questo risolve il problema solo per me, dato che se il file lo apre qualcun altro e non sa che bisogna cambiare la codifica, vedrà quello scempio

    2. ho modificato lo script che adesso non fa altro che leggere il file e salvarlo in uno utf-8 tenendo conto delle codifiche. Ecco il mio script (stavolta senza caratteri unicode):

    # -*- coding: utf-8 -*-
    import codecs
    import tkFileDialog
    import sys


    reload(sys)
    sys.setdefaultencoding( "windows-1250" )

    ######### Main ########
    fileOriginale = tkFileDialog.askopenfile(mode = 'r') #Questo file è in windows-1250

    nomeFileAggiustato = fileOriginale.name[0:len(fileOriginale.name)-4] + "_nuovo"+fileOriginale.name[len(fileOriginale.name)-4:]
    fileAggiustato = codecs.open(nomeFileAggiustato, 'w', 'utf-8') #Voglio che questo file SIA in UTF-8

    for riga in fileOriginale.readlines():
    fileAggiustato.write(riga.encode('windows-1250'))

    fileOriginale.close()
    fileAggiustato.close()

    ####################
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  9. #9
    Per completezza, la versione per Python 3.x (il quale non è retrocompatibile...).


    # -*- coding: utf-8 -*-
    import codecs
    from tkinter.filedialog import askopenfilename

    #\in Python 3.x UTF8 è la codifica predefinita

    nomeFileOriginale = askopenfilename()

    codificaFileOriginale = 'windows-1250' #se si hanno problemi con l'italiano, probabilmente qui dovrebbe starci windows-1252
    fileOriginale = codecs.open(nomeFileOriginale, 'r', codificaFileOriginale) #Questo file è in windows-1250

    nomeFileAggiustato = nomeFileOriginale[0:len(nomeFileOriginale)-4] + "_nuovo"+nomeFileOriginale[len(nomeFileOriginale)-4:]

    fileAggiustato = codecs.open(nomeFileAggiustato, 'w', 'utf-8')

    for riga in fileOriginale.readlines():
    fileAggiustato.write(riga) # utf-8 è già predefinito...

    fileOriginale.close()
    fileAggiustato.close()
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

  10. #10
    Versione per tutti i python grazie alle eccezioni:

    codice:
    # -*- coding: utf-8 -*-
    import codecs
     
    try:
        # Python 2.x. Usando Python > 3.x, ci sarà un'eccezione ed andremo al prossimo punto.
        from tkFileDialog import askopenfilename
    except ImportError:
        # Se siamo qui è stata lanciata l'eccezione, quindi siamo Python 3.x 
        from tkinter.filedialog import askopenfilename
    
    nomeFileOriginale = askopenfilename()
    
    codificaFileOriginale = 'windows-1250' #se si hanno problemi di accenti con file italiano, probabilmente qui dovrebbe starci windows-1252
    fileOriginale = codecs.open(nomeFileOriginale, 'r', codificaFileOriginale) #Questo file è in windows-1250
    
    nomeFileAggiustato = nomeFileOriginale[0:len(nomeFileOriginale)-4] + "_nuovo"+nomeFileOriginale[len(nomeFileOriginale)-4:]
    
    fileAggiustato = codecs.open(nomeFileAggiustato, 'w', 'utf-8')
    
    for riga in fileOriginale.readlines():
        fileAggiustato.write(riga) # utf-8 è già predefinito...
    
    fileOriginale.close()
    fileAggiustato.close()
    Libero > imposto
    Lunux > Windows
    Esperanto > lingua del padrone
    Kirek
    (dove > è "maggiore di")

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.