Teckenkodnings kul med Gradle

Teckenkodning

Vi är många som förespråkar byggverktyget Gradle för dess otroliga flexibilitet och smidiga samverkan med Maven. Denna gång ska vi dock belysa en liten lustighet avseende teckenkodning. Så gott som alla Javautvecklare har någon gång under sin karriär fått tampas med mer eller mindre obskyra teckenkodningsproblem. Denna gång är det, som det ska visa sig, Windows/Gradle som visar sig vara boven.

Uppsättningen

  • Byggverktyg: Gradle 4.7
  • IDE: IntelliJ IDEA
  • JDK: 10.0.1
  • Operativsystem: Windows 10

Det hela är ett enkelt webbprojekt. Outputen från bygget är en “fat”-jar ala Spring boot stuk.

Applikationen lyssnar bara på en port och skickar tillbaka ett enkelt JSON-objekt vid anrop.

Felet

Gradle clean build; gradle run är kommandot som används för att bygga samt starta applikationen. Overkill, men vi gör det för att vara övertydliga och underlätta vår felsökning. Projektet tar bara några sekunder att bygga/deploya så den extra tiden är i detta fall försumbar.

Vår enkla applikation startar upp snabbt och smidigt, men ack vad besvikna vi blir när vi surfar in på “sidan”.

Det vi får se är då: Fel tecken

Samt i terminalloggen:

...
DEBUG se.exertusit.time.JsonTransformer - obj: {"id":1,"name":"svenska tecken: åäöÅÄÖ"}
...

Felsökning

Det första som undersöks är att projektets filer är sparade i UTF-8. Detta görs i IntelliJ och mycket riktigt är alla filer i hela projektet så väl som vår huvudklass Application.java sparade i UTF-8.

Nästa tanke är att det kanske är fel charset i vårt HTTP Response objekt. Undersökning av sidinfo i webbläsaren ger oss: Sidinfo

Ingen lycka där heller med andra ord.

Lösningen

Efter att ha säkerställt ovan så föddes en tanke. Applikationen är otroligt enkel, så vad händer om vi istället startar den direkt i IntelliJ genom att helt sonika köra Application.java?

Applikationen startar upp utan bekymmer.

Vi surfar åter in på vår enkla sida.

Nu ser det betydligt roligare ut: Rätt tecken

Samt i terminalloggen:

...
DEBUG se.exertusit.time.JsonTransformer - obj: {"id":1,"name":"svenska tecken: åäöÅÄÖ"}
...

Eureka! Vi är äntligen något på spåren.

Efter en stund av hardcore nördande upptäcktes att Gradle nyttjar Operativsystemets default file encoding, d.v.s. i vårt fall CP1252 eftersom vi använder Windows 10. Detta oavsett om vi triggar bygget via IntelliJ eller PowerShell. För att få bukt med denna möjlighet krävdes att vi hårt specificerade för Gradle vilken file encoding som ska nyttjas vid kompilering av Java-koden. Raderna som behövde läggas till i build.gradle:

...
tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
...

Ombygge av applikationen via Gradle följt av gradle run ger nu: Rätt tecken

Samt i terminalloggen (gradle run triggas innifrån IntelliJ):

...
DEBUG se.exertusit.time.JsonTransformer - obj: {"id":1,"name":"svenska tecken: åäöÅÄÖ fixat"}
...

Notis: Om vi startar applikationen via t.ex. PowerShell istället för IntelliJ så kommer loggutskrifterna i terminalen ha teckenkodningsfel eftersom terminalen kör CP1252.

Vi hoppas att ni haft nytta av denna guide.
Om ni vill veta mer tveka då inte att höra av er genom att fylla i nedan formulär så återkommer vi!

Vi har mottagit ditt meddelande och återkommer inom kort.
Hoppsan! Något gick dessvärre fel, vänligen verifiera att du inte är en robot eller ladda om sidan och försök igen.
Vi vill göra dig uppmärksam på att vi behandlar dina uppgifter i strikt enlighet med vår Integritetspolicy. Allt för att du ska känna dig trygg i att vi värnar om din integritet.