Mi dispiace molto, ma scrivere un simbolo in un file di testo senza dire ciò che la codifica del file dovrebbe essere è semplicemente non senso.
Potrebbe non essere evidente a prima vista, ma i file di testo sono infatti codificati e possono essere codificati in modi diversi. Se hai solo lettere (maiuscole e minuscole, ma non accentate), cifre e simboli semplici (tutto ciò che ha un codice ASCII sotto 128), tutto dovrebbe andare bene, perché i 7 bit ASCII sono ormai uno standard e in effetti quei caratteri hanno la stessa rappresentazione nelle principali codifiche.
Ma non appena si ottengono simboli veri o caratteri accentati, la loro rappresentazione varia da una codifica all'altra. Ad esempio, il simbolo ● ha una rappresentazione UTF-8 di (codifica Python): \xe2\x97\x8f
. Ciò che è peggio, non può essere rappresentato nella codifica latin1 (ISO-8859-1).
Un altro esempio è il francese e accento aigu: é
è rappresentato in UTF-8 come \xc3\xa9
(nota 2 byte), ma è rappresentato in Latin1 come \x89
(un singolo byte)
Così ho provato il codice nella mia casella Ubuntu utilizzando una codifica UTF8 e il comando cat myFile.txt
... ha mostrato correttamente il proiettile!
[email protected]:~/stackoverflow$ cat myFile.txt
●[email protected]:~/stackoverflow$
(come non è stato aggiunto alcun ritorno a capo dopo il proiettile, il prompt segue immediatamente esso)
In conclusione:
Il codice scrive correttamente il proiettile al file nella codifica UTF8. Se il tuo sistema usa nativamente un'altra codifica (ISO-8859-1 o la sua variante Windows-1252) non puoi convertirlo nativamente perché questo personaggio semplicemente non esiste in questa codifica.
Ma è sempre possibile vederlo in un editor di testo che supporta codifica diversa come l'eccellente vim esistente su tutti i principali sistemi.
Prova di sopra:
Su un computer Windows 7, ho aperto una finestra di vim e istruito ad accettare utf8 con :set encoding='utf8'
. Ho quindi incollato il codice originale da OP e l'ho salvato in un file foo.py
.
ho aperto una finestra cmd.exe
ed eseguito python foo.py
(utilizzando un Python 2.7): ha creato un file myFile.txt
contenente i 3 byte (esa): e2 97 8f
che è la rappresentazione utf8 del proiettile ●
(ho potuto confermare con vim Tools/Hexa convert).
Potrei anche aprire myFile.txt
inattivo e in realtà ho visto il proiettile. Anche notepad.exe
potrebbe mostrare il proiettile!
Quindi, anche su un computer Windows 7 che non nativamente accetta utf-8, il codice OP genera correttamente un file di testo che quando aperto con un editor di testo che accetta UTF-8 contiene il proiettile ●
.
Naturalmente, se si tenta di aprire myFile.txt
con vim in modalità latin1, ottengo: â—
, su una finestra CMD con tabella codici 850, type myFile.txt
mostra ÔùÅ
, e con tabella codici 1252 (variante latin1): A-.
In conclusione, il codice OP crea un file codificato utf8 corretto: spetta alla parte di lettura interpretare correttamente utf8.
Grazie per le vostre risposte! Ho scoperto che il problema era che Wordpad non mostrava il punto, ma il blocco note lo ha fatto. Quindi in realtà ha funzionato sin dall'inizio. –
Python 2 o 3? (Suggerimento: Py3 è migliore) – JeromeJ
Ancora, ci sono problemi con il codice qui sopra: fondamentalmente funziona solo se (1) il tuo editor di programma usa effettivamente UTF-8 (questo potrebbe non essere stato il caso) e (2) con il testo visualizzatori di file che utilizzano la stessa codifica del * tuo * editor di programmazione. Puoi dare un'occhiata alla mia soluzione, a qualcosa che dovrebbe dare "●" su quasi tutte le macchine, per quasi tutti gli utenti, qualunque sia la loro codifica di scelta. – EOL