streng - hvordan man undgår rodede koder, når de udsender kinesiske tegn

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har fundet et mærkeligt problem med at skrive kinesiske tegn i en fil af writeFile.


> writeFile "r.txt" "过"  -- outputting as expected.


Indtast billedbeskrivelse her [12]


> writeFile "r.txt" "图"  -- not displaying as expected. see the following:


Indtast billedbeskrivelse her [13]


Så sker den fremmede ting:


> writeFile "r.txt" "图画"  -- outputting is normal, as follows: 


Indtast billedbeskrivelse her [14]


Flere eksempler, der viser rodet koder:


> writeFile "r.txt" "士"
> writeFile "r.txt" "十"
> writeFile "r.txt" "千"
> writeFile "r.txt" "一"
> writeFile "r.txt" "一千十士图" -- This is displayed as messy codes.


Men følgende er normalt:


> writeFile "r.txt" "一千十士图画" -- This is normal.


Så det er normalt, hvis ovenstående tegn eksporteres sammen med andre tegn, der normalt kan vises som writeFile "r.txt" "十过".



Jeg har ingen anelse om, hvorfor dette sker:


- Hvorfor nogle tegn udgives som rodede koder, mens andre ikke? Faktisk er '一千 十 士 图' de mest brugte tegn på kinesisk.


- Hvorfor tegnene, der eksporteres som rodet koder, kan vises normalt sammen med andre tegn, der kan vises normalt?


Jeg sætter pris på det, hvis nogen kan give nogle oplysninger.

Bedste reference


For det første er dette et glimrende spørgsmål. Kodningsproblemer er stadig et problem, selv nu. Windows bruger som standard UTF-16 nu, mens meget af Haskell er udviklet på UTF-8-platforme. Den egentlige kodning, der anvendes af System.IO -funktionerne, er ikke veldefineret i løbetid, da den er sat af platformmiljøet eller vælges vilkårligt hvis ikke. [15]


Den første ting at gøre er at skifte til Data.Text til teksthåndtering. Ikke alene er dette mere opmærksom på kodninger, det er også betydeligt mere effektivt end modellen 'List of Characters', som String er. Det har egne I/O-funktioner, der også tager hensyn til specifikke kodninger . [16] [17]


For at gøre det nemmere vil det være meget nyttigt at aktivere OverloadedStrings. Også siden du bruger strenge bogstaver, kontrollerer du, at kildekodefilkodningen svarer til miljøet, når GHC compilerer det, det vil også hjælpe. Der er mange steder, der håndterer disse data, og over et bestemt punkt, indlæser dine strenge fra en kendt-god fil ender med at være mindre af hovedpine end at sætte dem i kilden. [18]