Tema: Re: Javascript charset=windows-1257 neveikia
Autorius: Laimis
Data: 2015-10-15 19:45:47
Nioka rašė:

> Šį failą matau ir koreguoju su Notepad++. Jis nėra utf-8. Vienu metu jame
> nematau ir lietuviškų raidžių ir kirilicos, bet matau arba vienas arba kitas
> teisingai, kai pakeičiu Notepad'e Encoding. Tokio pat rezultato tikėjausi ir

Tai blogai. Problema ta, kad programos interpretuoja tekstinius failus, 
kaip esančius kažkokios (vienos) koduotės (numatytoji OS, nustatyta 
programos), o jei faile esi tiesiog prirašęs baitų, kurios tik pats 
žinai, kaip interpretuoti (čia jie vienoje koduotėje, čia kitoje), tai 
programa juk to nežino. Taigi, tie skirtingi užrašai, nors esantys 
skirtingose koduotėse, interpretuojami esantys *vienoje* (kažkokioje, 
nustatytoje) koduotėje ir verčiami į vidinę koduotę (unikodą). Todėl, 
jei užrašai yra skirtingų koduočių, jie yra sugadinami jau šioje fazėje 
(skaitant asp failą).
Sprendžiant iš to, kad lietuviškos raidės pavirsta kirilica, tai ta 
nustatytoji IIS koduotė yra rusiška.

Apskritai tokiu atveju (primaišyta skirtingų koduočių užrašų) programoje 
reikia daryti tikslinį transkodavimą.

Du momentai:
- ar tau tikrai reikalingos skirtingos koduotės? Kas paskui su tais 
duomenimis vyksta (jie rašomi į DB?). DB matyt unikodinė, net jei tau 
taip neatrodo. Kaip iš DB gaunami skirtingos koduotės duomenys? Kas tai 
nustato? Jei nereikia skirtingų koduočių, tai pasirink utf-8 ir 
nebeturėsi tokių problemų: visi skirtingų kalbų užrašai gali būti 
vienoje koduotėje ir tada bereiks tą koduotę nurodyti ASP ir nebereikės 
jo kaitalioti.

- išsaugok tą failą utf-8 koduotėje, nustatyk tą koduotę IIS ir paskui 
(žr. žemiau), priklausomai nuo kalbos, daryk transkodavimą su 
Response.CodePage()


> funkc. ir šiame faile reikia įdėti
> <%@ CodePage=65001 Language="JScript"%>
> arba
>   Response.CodePage = 65001
>   Response.CharSet = "utf-8"
> Ar teisingai supratau?

Taip. Bet dar reikėtų, kad ir pats failas su užrašais būtų korektiškai 
išsaugotas utf-8 koduotėje.


>
> Klausimas, ar galima įdėti ir Response.CharSet = "windows-1257", ir
> Response.CharSet = "windows-1252", ir Response.CharSet = "windows-1251",
> kurie būtų vykdomi pagal nurodytą kalbą [ if(lang==="Lituana"),
> if(lang==="Russian") ir pan.]?


Response.CodePage() nurodo į kokią koduotę (iš viduje naudojamo unikodo) 
perkoduoti išvedant.

Response.CharSet nieko neperkoduoja, tik HTTP antraštėse nurodo koduotę, 
kad tokią koduotę naršyklė parinktų atvaizduodama tekstą. Analogiškai, 
kaip ją nurodai HTML faile:
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">

Taigi, jei naudoji Response.CharSet(), tai HTML faile paprastai 
nebereikia meta eilutės su charset.
Svarbu: koduotė, kurią nurodai naršykle (Response.CharSet() ar meta 
tag'u su charset) turi sutapti su tikrąja išvedimo koduote 
(Response.CodePage()); jei jos nesutampa, tai nematysi korektiškai.