Jag har lite problem med remotestick-server och rätt encoding av namnet när jag lägger till nya enheter. Namnet får jag över ett HTTP request in till ett python-skript och om jag inte behandlar strängen alls så går det bra att skicka in den till tdSetName() så länge strängen inte innehåller några non-ascii tecken. Om jag t.ex. skickar med åäö så ballar det ur. Dels om jag skriver ut strängen på prompten så blir det bara "???" och namnet som registreras i TelldusCore blir helt förvrängt.
Strängen som kommer över HTTP är kodad i latin1 och om jag kör name.decode('latin1') så får jag tillbaka en sträng som, när jag skriver ut den på prompten, ser ut som den ska. Men när jag skickar in den till TelldusCore så blir det nu ännu värre än tidigare. (För Linux:) Skickar jag in en sträng med bara non-ascii så lagras bara det första tecknet. Skickar jag in åäö så lagras bara ett tecken men helt förvrängt. (För Mac OS X:) Oavsett vad jag skickar in så smäller python-skriptet med felet "Bus error".
Så min fråga är egentligen. Hur ska strängen vara kodad för att TelldusCore ska acceptera den och kunna ta emot åäö?
TelldusCore och encoding
Moderator: Telldus
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Re: TelldusCore och encoding
TelldusCore tar emot strängen som en "const char *". D.v.s. en åtta bitars char.
Internt konverteras denna sedan till en std::string.
På Mac OS X sker själva skrivningen via QSettings::setValue(). Här blir det först en "const char *" via std::string::c_str() som sedan blir en QVariant. Qt förutsätter här att strängen är en Latin-1.
Under Linux blir strängen åter en "const char:*" via std::string::c_str() innan den skickas till cfg_setstr(). Jag gissar att aktuell encoding här tas från miljön.
Du kan testa att köra:
för att se aktuell encoding
Internt konverteras denna sedan till en std::string.
På Mac OS X sker själva skrivningen via QSettings::setValue(). Här blir det först en "const char *" via std::string::c_str() som sedan blir en QVariant. Qt förutsätter här att strängen är en Latin-1.
Under Linux blir strängen åter en "const char:*" via std::string::c_str() innan den skickas till cfg_setstr(). Jag gissar att aktuell encoding här tas från miljön.
Du kan testa att köra:
Code: Select all
$ locale
Micke Prag
Software
Telldus Technologies
Software
Telldus Technologies
Re: TelldusCore och encoding
Vet inte om jag blev så mycket klokare av det. Behöver jag känna till något vad gäller const char* -> std::string konverteringen? Jag är inte alls hemma vad gäller C++. Jag skulle kanske kunna ta ett fullt fungerande C-program (som använder TelldusCore) och se hur dess input till tdSetName egentligen ser ut...?
-
- Site Admin
- Posts: 2243
- Joined: Fri Mar 17, 2023 9:45 am
- Location: Lund
- Contact:
Re: TelldusCore och encoding
Mellan const char * -> std::string bör ingen konvertering ske. std::string använder också en 8 bitars char.
Vad jag tror spelar roll är den aktuella encodingen.
Vad jag tror spelar roll är den aktuella encodingen.
Micke Prag
Software
Telldus Technologies
Software
Telldus Technologies