Permalänk
Medlem

Unicode literals

Hej,

Jag skriver en applikation som ska vara kompatibel med py2 samt py3 och använder mig utav unicode_literals, men jag har problem med att konvertera åäö, någon som möjligtvis vet hur man kan lösa detta?

# -*- coding: utf-8 -*- from __future__ import unicode_literals

record_folder = "C:\Users\User\Desktop\åäö" if buttonClicked == PopupMenu.C_POPUP_RECORDINGS: record_folder = ADDON.getSetting('record_folder') xbmc.executebuiltin('ActivateWindow(Videos,{record_folder},return)'.format(record_folder=record_folder) )

Log:

xbmc.executebuiltin('ActivateWindow(Videos,{record_folder},return)'.format(record_folder=record_folder) ) UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 33: ordinal not in range(128)

Permalänk
Medlem

Problemet är inte åäö utan att du glömt escape:a dina backslash. Det här ska funka bättre:

record_folder = "C:\\Users\\User\\Desktop\\åäö"

Kom ihåg att \ är ett specialtecken i strängar. Till exempel "\U00a0" blir ett så kallat ”non-breaking space”. "\Users" däremot är en ogiltig escape. Om man vill ha faktiska backslash behöver man dubblera dem.

(Notera också att Python 2 is sunset.)

Permalänk
Medlem
Skrivet av lydell:

Problemet är inte åäö utan att du glömt escape:a dina backslash. Det här ska funka bättre:

record_folder = "C:\\Users\\User\\Desktop\\åäö"

Kom ihåg att \ är ett specialtecken i strängar. Till exempel "\U00a0" blir ett så kallat ”non-breaking space”. "\Users" däremot är en ogiltig escape. Om man vill ha faktiska backslash behöver man dubblera dem.

(Notera också att Python 2 is sunset.)

Aha grymt stort tack! Jag har länge kliat mig i huvudet vad som kan vara fel.

Permalänk
Medlem

@lydell Hmm blir inte riktigt klok på detta, jag escapar stringen och decodar till utf-8? Vad gör jag för fel, varför får jag dessa specialtecken istället för "åäö"?

record_folder = ADDON.getSetting('record_folder').encode('string-escape').decode('utf-8') xbmc.executebuiltin('ActivateWindow(Videos,{record_folder},return)'.format(record_folder=record_folder))

Resultat:

C:\\Users\\User\\Desktop\\\xc3\xa5\xc3\xa4\xc3\xb6\\

Permalänk
Medlem

❯ python2 Python 2.7.16 (default, Dec 21 2020, 23:00:36) >>> 'å' '\xc3\xa5' >>> print '\xc3\xa5' å >>> 'å'.encode('string-escape') '\\xc3\\xa5' >>> 'å'.encode('string-escape').decode('utf-8') u'\\xc3\\xa5' >>> print 'C:\\Users\\User\\Desktop\\\xc3\xa5\xc3\xa4\xc3\xb6\\' C:\Users\User\Desktop\åäö\

'\xc3\xa5' är ett annat sätt att göra 'å'.

Ta bort .encode('string-escape').decode('utf-8') kanske?

Permalänk
Medlem
Skrivet av lydell:

❯ python2 Python 2.7.16 (default, Dec 21 2020, 23:00:36) >>> 'å' '\xc3\xa5' >>> print '\xc3\xa5' å >>> 'å'.encode('string-escape') '\\xc3\\xa5' >>> 'å'.encode('string-escape').decode('utf-8') u'\\xc3\\xa5' >>> print 'C:\\Users\\User\\Desktop\\\xc3\xa5\xc3\xa4\xc3\xb6\\' C:\Users\User\Desktop\åäö\

'\xc3\xa5' är ett annat sätt att göra 'å'.

Ta bort .encode('string-escape').decode('utf-8') kanske?

Hur gör jag om slash till dubbelslash om jag tar bort .encode('string-escape')? Kör jag .replace så får jag decode error.

record_folder = ADDON.getSetting('record_folder').replace('\\', '\\\\') xbmc.executebuiltin('ActivateWindow(Videos,{record_folder},return)'.format(record_folder=record_folder))

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 33: ordinal not in range(128)

Permalänk
Medlem

Här tar min Python-kunskap slut tyvärr.

Permalänk
Medlem
Skrivet av lydell:

Här tar min Python-kunskap slut tyvärr.

Ja min med, detta var lite klurigt. Det är just unicode literals som ställer till det. Men tack för all hjälp!

Permalänk
Medlem

Jag fann lösningen på mitt problem, tänkte dela med mig här, man var alltså tvungen att göra om bytes till native string för att få det att fungera i Python 2 med unicode literals:

from _future_ import unicode_literals from future.utils import bytes_to_native_str as native record_folder = native(ADDON.getSetting('record_folder')) xbmc.executebuiltin(b'ActivateWindow(Videos,{record_folder},return)'.format(record_folder=record_folder))

Resultat:
C:\Users\User\Desktop\åäö\