Hei,
Olen tehnyt tekstipeliä Pythonilla (3.1) . Tein siitä cx_freezellä exe-tiedoston, mutta komentorivi ei näytä ääkkösiä, vaan korvaa ne "-merkeillä. Tiedän kyllä, että komentorivi ei osaa lukea unicodea, jos codepagea ei vaihda. Olen löytänyt ongelmaan kolme ratkaisua, mutta en osaa toteuttaa niitä tai edes tiedä ovatko ne mahdollisia.
1. ratkaisu olisi muuttaa pythontiedoston koodaus ennen exeksi muuntamista. En ole vain saanut cx_freezeä toimimaan muulla koodauksella kuin unicodella.
2. ratkaisu olisi muuttaa koodaus exeksi muuntamisen jälkeen. En vain tiedä miten sen voisi tehdä. cx_freezellä muuntamisestahan jää käteen:
- exe-tiedosto
- python-tiedostoja pakattuna
- python dll
- unicodedataa
3. ratkaisu olisi tehdä jonkilainen batch, joka muuttaa codepagen ennen ohjelman avaamista. Yritin, mutta sain muutettua vain batchin oman komentorivi-ikkunan codepagea, mutten exen komentorivin codepagea.
Peli tulee internettiin jakeluun, joten olisi kätevää, jos pelin voisi suorittaa
ilman että käyttäjän ei tarvitse tehdä muuta kuin avata exe.
Olisin kiitollinen, jos löytäisitte ratkaisun.
# -*- coding: sopiva_merkistö -*-
Tuollainen koodin ekalle riville ja tavallinen kääntäminen.
https://www.ohjelmointiputka.net/oppaat/opas.
Laitoin ohjelman alkuun:
# -*- coding: cp1252 -*- module.code = compile(codeString, path, "exec") File "Begar in Kökar.py", line 242 RetrettiMökki () ^ SyntaxError: invalid character in identifier
Kaatuu siis ensimmäisessä funktion nimessä olevassa ö-kirjaimessa.
Stringit sen sijaan näyttävät menevän läpi hyvin.
Funktion nimi liittyy kääntäjän ominaisuuksiin.
Korjausehdotuksia? Muita kuin vaihtaa kaikki funktioiden nimissä olevat ääkköset?
Valitsemasi koodaus näyttäisi tuon perusteella olevan pielessä, koska cp1252:ssa ö-kirjain on yhden tavun levyinen mutta virheilmoituksessa näkyy kaksi tavua. Kokeilepa laittaa koodaukseksi UTF-8.
Sancrotis kirjoitti:
Korjausehdotuksia? Muita kuin vaihtaa kaikki funktioiden nimissä olevat ääkköset?
Katsoa voiko kääntäjän asetuksia muuttaa tai hommata uusi kääntäjä.
Yritin vaihtaa UTF8:ksi, mutta exessä oli yhä ääkkösten paikalla ". Kokeilin huvin vuoksi vaihtaa funktioiden nimet äö:stä ao:ksi cp1252:n kanssa. cx_freeze ei kaatunut, mutta ääkköset eivät toimineet exessä.
Laitoin ohjelman alkuun:
# -*- coding: cp1252 -*-
ja tällä kertaa cx_freeze ei kaatunut. Mutta exessä ei näy taaskaan. Alkaa ässät kyllä loppua hihasta tässä vaiheessa.
Yleisohje ongelmatilanteisiin: jaa ongelma pienempiin osiin.
Aiemmin mainittu merkistöopas kannattaa ehdottomasti lukea ja ymmärtää. Sitten voit lähestyä ongelmaa pala kerrallaan. Jos jokin vaihe menee pieleen, palaa aina taaksepäin ja yritä uudestaan toisella tavalla.
python koodi.py
tai vastaavalla.Yhdistä edellä tehdyt ohjelmat.
Testaa ohjelma komentoriviltä käsin.
Paketoi koodi cx_Freezellä.
Sori, mulla ei oo oikeasti enää mitään ideaa, jota voisin kokeilla. Olen vaihtanut coding-tekstin UTF-8:aan ja cp1252, olen myös yrittänyt tallentaa python-tiedostoa unicodeksi, UTF-8 ja ANSI:ksi muistiolla. Ei mitään. Aina sama riivattu "-merkki. Pythonin sisällä kaikki toimii kuten pitääkin ja ääkköset tulevat iloisesti näkyviin, mutta heti kun konverttaa exeksi niin ei toimi. En oikeasti käsitä enää. Mielestäni olen eliminoinut kaikki mahdolliset muuttujat jo pois.
Mitä sys.stdout.encoding sisältää eri ajotavoilla?
Pythonissa Idlellä:
Tässä ohjelmassa käytetään cp1252-merkistöä.
sys.stdout.encoding = cp1252
len("ä") = 1
Pythonin komentorivillä:
Tässä ohjelmassa käytetään cp1252-merkistöä.
sys.stdout.encoding = cp850
len("ä") = 1
Cx_freezen jälkeen komentorivillä:
T"ss" ohjelmassa k"ytet""n cp1252-merkist"".
sys.stdout.encoding = cp850
len(""") = 1
Eli ääkköset näkyvät komentorivillä cp850:llakin, mutta exettämisen jälkeen eivät sitten toimi cp850:lla.
"Pelkkä Python-koodin alussa oleva merkistöilmoitus ei saa ohjelmaa toimimaan muita merkistöjä käyttävissä ympäristöissä."
sanotaan oppaassa eli jos ilmoitan koodin alussa, että on cp1252 käytössä, sen ei pitäisi toimia 850:llaa käyttävässä ympäristössä?
Mitä jos lukisit sen koko oppaan etkä vain poimisi sieltä yksittäisiä lauseita? Oppaassa selitetään, että merkistöilmoitus ei pelkästään riitä, vaan lisäksi pitää käyttää Pythonin Unicode-tekstejä. Lopussa on Python 3:sta maininta, jossa kerrotaan, että siinä tekstit ovat lähtökohtaisesti jo Unicode-tekstejä, joten ongelmia ei pitäisi juurikaan olla, kunhan merkistöilmoitus on kunnossa.
Mutta ilmeisesti cx_Freeze tosiaan mokaa jotain tuon merkistöasian kanssa. Kokeile vielä tätä ja kerro tulos:
print("ä", ord("ä"), chr(228)) # Toivottu tulos: ä 228 ä
Ei vain onnistu. Joudun kirjoittamaan uudestaan GUI:n kanssa. Kiitos kuitenkin avusta!
Aihe on jo aika vanha, joten et voi enää vastata siihen.