Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Unicode-ongelma komentorivissä

Sivun loppuun

Sancrotis [22.01.2011 12:38:11]

#

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.

Jokotai [22.01.2011 13:03:36]

#

# -*- coding: sopiva_merkistö -*-

Tuollainen koodin ekalle riville ja tavallinen kääntäminen.
https://www.ohjelmointiputka.net/oppaat/opas.php?tunnus=python_l2

Sancrotis [22.01.2011 13:56:52]

#

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.

Jokotai [22.01.2011 14:09:06]

#

Funktion nimi liittyy kääntäjän ominaisuuksiin.

Sancrotis [22.01.2011 14:24:11]

#

Korjausehdotuksia? Muita kuin vaihtaa kaikki funktioiden nimissä olevat ääkköset?

Metabolix [22.01.2011 15:36:43]

#

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.

Jokotai [22.01.2011 15:40:43]

#

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ä.

Sancrotis [22.01.2011 16:34:20]

#

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ä.

Sancrotis [22.01.2011 21:00:24]

#

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.

Metabolix [22.01.2011 21:15:58]

#

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.

    1. Tee ohjelma, joka tulostaa kirjaimen ä.
    2. Testaa ohjelma komentoriviltä käsin komennolla python koodi.py tai vastaavalla.
    3. Paketoi koodi cx_Freezellä ja testaa uudestaan.
    1. Tee ohjelma, jossa on funktio, jonka nimessä on kirjain ä.
    2. Testaa ohjelma komentoriviltä käsin.
    3. Paketoi koodi cx_Freezellä ja testaa uudestaan.
  1. Yhdistä edellä tehdyt ohjelmat.

  2. Testaa ohjelma komentoriviltä käsin.

  3. Paketoi koodi cx_Freezellä.

Sancrotis [22.01.2011 22:24:22]

#

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.

Metabolix [22.01.2011 22:39:49]

#

Mitä sys.stdout.encoding sisältää eri ajotavoilla?

Sancrotis [22.01.2011 23:27:41]

#

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

Sancrotis [23.01.2011 11:08:19]

#

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ä?

Metabolix [23.01.2011 14:07:09]

#

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 ä

Sancrotis [23.01.2011 22:22:50]

#

Ei vain onnistu. Joudun kirjoittamaan uudestaan GUI:n kanssa. Kiitos kuitenkin avusta!


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta