windows - Python - Encoding string - Svenske bogstaver

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har nogle problemer med Python's raw\_input kommando (Python2.6),
Af en eller anden grund får raw\_input ikke den konverterede streng, som swedify () producerer, og det giver mig en kodningsfejl, som jeg er opmærksom på, det er derfor jeg lavede swedify () til at begynde med.
Her er hvad jeg forsøger at gøre:


elif cmd in ('help', 'hjälp', 'info'):
    buffert += 'Just nu är programmet relativt begränsat,
De funktioner du har att använda är:
'
    buffert += ' * historik :: skriver ut all din historik
'
    buffert += ' * ändra <något> :: ändrar något i databasen, följande finns att ändra:
'
    print swedify(buffert)


Det virker fint, det giver de svenske tegn ud, ligesom jeg vil have dem til konsollen.
Men når jeg forsøger at (i samme kode, med samme \ x ?? værdier, udskrive dette stykke:


core['goalDistance'] = raw\_input(swedify('Hur långt i kilometer är ditt mål: '))
core['goalTime'] = raw\_input(swedify('Vad är ditt mål i minuter att springa ' +  core['goalDistance'] + 'km på: '))


Så får jeg det her:


C:UsersAnon>python löp.py
Traceback (most recent call last):
  File "l÷p.py", line 92, in <module>
    core['goalDistance'] = raw\_input(swedify('Hur långt i kilometer är ditt mål: '))
UnicodeEncodeError: 'ascii' codec can't encode character u'xe5' in position 5: ordinal not in range(128)


Nu har jeg gået rundt, fundet nogle 'løsninger', men ingen af ​​dem arbejder, nogle triste, at jeg skal lave et batch script, der udfører chcp ??? i starten, men det er ikke en ren løsning IMO.


Her er swedify:


def swedify(inp):
    try:
        return inp.decode('utf-8')
    except:
        return '(!Dec:) ' + str(inp)


Eventuelle løsninger på, hvordan man får raw\_input til at læse min returværdi fra swedify ()?
Jeg har prøvet fra kodninger import getencoder, getdecoder og andre men intet til det bedre.

Bedste reference


Du nævner det faktum, at du har modtaget en kodningsfejl, der motiverede dig til at skrive swedify i første omgang, og du har fundet løsninger omkring chcp, som er en Windows-kommando.


På * nix-systemer med UTF-8-terminaler er swedify ikke nødvendigt:


>>> raw\_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 100
'100'
>>> a = raw\_input('Hur långt i kilometer är ditt mål: ')
Hur långt i kilometer är ditt mål: 200
>>> a
'200'


FWIW, når jeg gør bruger swedify, får jeg den samme fejl, du gør:


>>> def swedify(inp):
...     try:
...         return inp.decode('utf-8')
...     except:
...         return '(!Dec:) ' + str(inp)
... 
>>> swedify('Hur långt i kilometer är ditt mål: ') 
u'Hur lxe5ngt i kilometer xe4r ditt mxe5l: '
>>> raw\_input(swedify('Hur långt i kilometer är ditt mål: '))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xe5' in position 5: ordinal not in range(128)


Din swedify -funktion returnerer et unicode-objekt. Den indbyggede raw\_input er bare ikke tilfreds med unicode-objekter.


>>> raw\_input("å")
åeee
'eee'
>>> raw\_input(u"å")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'xe5' in position 0: ordinal not in range(128)


Du vil måske prøve dette i Python 3. Se denne Python bug. [18]


Også af interesse: Sådan læses Unicode-input og sammenligner Unicode-strenge i Python?.


UPDATE Ifølge dette blogindlæg er der en måde at indstille systemets standardkodning på. Dette kan være et forsøg værd. [20]

Andre referencer 1


For mig fungerede det fint med:


#-*- coding: utf-8 -*-
import sys
import codecs
koden=sys.stdin.encoding

a=raw\_input( u'Frågan är öppen? '.encode(koden))
print a


Om

Andre referencer 2


På Windows er konsolets oprindelige Unicode-support brudt. Selv den tilsyneladende UTF-8-kodeside er ikke en ordentlig løsning.


For at læse og skrive med Windows-konsollen skal du bruge https://github.com/Drekin/win-unicode-console, som fungerer direkte med den underliggende konsol API, så multi-byte-tegn læses og skrives korrekt. [21]

Andre referencer 3


Windows kommandoprompt bruger Codepage 850, når du bruger svenske regionale indstillinger (https://en.wikipedia.org/wiki/Code\_page\_850).
Det er sandsynligvis brugt på grund af backward kompatibilitet med gamle MS-Dos programmer. [22]


Du kan indstille Windows-kommandoprompt til at bruge UTF-8 som kodning ved at indtaste:
chcp 65001 (Unicode tegn i Windows kommandolinje - hvordan?)

Andre referencer 4


Prøv denne magiske kommentar øverst på dit script:


# -*- coding: utf-8 -*-


Her er nogle oplysninger om det:
http://www.python.org/dev/peps/pep-0263/[24]

Andre referencer 5


Løsning på mange problemer:






Rediger: C: \ Python ?? \ Lib \ Site.py
Udskift 'del sys.setdefaultencoding' med 'pass'




Så,

Sæt dette øverst i din kode:


sys.setdefaultencoding('latin-1')


Den hellige gral at fastgøre de svenske/ikke-UTF8 kompatible tegn.