түрлі PHP кодтауы
сценарий жазушыларын кодтау сияқты нәрсеге қызықтырмайды. Сондықтан, сайттарда кейде дерекқордан алынған деректер бір кодтауда алынған кезде, басқа біреуден қалыптасады және сервер үшіншіге беріледі. нәтижесінде, егер бет шифры шешілсе, кем дегенде 2 рет. Сонымен, неге осындай проблема туындайды және оны қалай жеңуге болады?
ресейлік сегментте көбінесе Windows-кодтау деп атауға болады. оны басқаша атаңыз: windows-1251, cp1251 немесе тіпті анси. Келесі - utf-8. Unicode атауын да табуға болады, бірақ бұл дұрыс емес, себебі Unicode - бүкіл топтың жалпы аты (utf-8, utf-16, utf-32). және өте танымал сирек болып табылады koi8-r немесе жай koi-8 - бір кездері танымал Linux кодтау. Әрине, ресейлік сегментте тағы бір нәрсе кездесуге болады, бірақ бұл автордың «ымырасыздығы».
Utf-8 және басқалардың арасындағы басты айырмашылық (бірінші кезекте windows-1251 және koi8-r) - бұл соңғы бір байт және осы кодтау арқылы ұсынылуы мүмкін таңбалардың максималды саны 256-ға дейін шектеледі. Бұл мәтіннің толық мәтінін көрсету үшін жеткіліксіз болуы мүмкін. және html үшін шешім табылды - деп аталатын мнемоника. мысалы:
© - & көшірме;
сонымен қатар, әрқайсысы осындай кейіпкерлерді кейіпкерлер тобымен сипаттайтындықтан, код оқылмайды және мәтінмен жұмыс күрделене түседі. бұл құтқару үшін multibyte utf-8 пайда болады. әр түрлі әріптер мен әріптерді бір мәтінде пайдалану өте ыңғайлы.
Осылайша, бастапқы шарттарының ең қолайлы жиынтығы келесідей: дерекқорды кодтау, php сценарийлері және html беттер / js сценарийлері бірдей болуы керек. Әрине, әртүрлі қолдануға болады, бірақ бұл жағдайда шатастырып алу қаупі бар. қандай кодтық бет қолданылғаны маңызды емес. егер сайт орыс тілді аудиторияға арналған болса, windows-1251 жеткілікті болады. әйтпесе, utf-8 логикалық таңдау болады. бірінші опция көп немесе аз анық. көпбеттік кодтау кейбір қимылдарды талап етеді.
Utf-8-мен жұмыс істеген кезде стандартты блокнот блокнот жұмыс істемейді ! Өйткені, бұл редактор, осы кодтауда файлды сақтаған кезде, файлды ашқан кезде кодтауды анықтау үшін пайдаланылуы мүмкін бом деп аталатын 3 таңбаға - 3 таңбаға қолтаңбаны қосады. басқа редакторды таңдау керек: notepad2 немесе блокнот ++ . параметрлерде қолтаңбасыз сақтау үшін таңдау керек.
Келесі маңызды қадам деректер базасымен жұмыс істейді. Негізгі / кесте / мәтіндік өрісті кодтау сценарий кодтамасына сәйкес келеді (бұл cp1251 немесе utf-8 немесе басқа нәрсе болуы мүмкін). егер дерекқордан алынған деректер «zyuk» түрінде алынса, байланыс деректерін кодтау дерекқорда сақталған деректерден өзгеше болады. Келесі сұраныс жағдайды жеңуге көмектеседі (дерекқорға қосқаннан кейін бірден орындаңыз):
егер сайт windows-1251 пайдаланса, оны көрсетуіңіз керек - cp1251.
Жалпы, қиындықтар жоқ. тек стандартты php функциялары көпбiр жолдармен жұмыс iстеуге арналмаған. бірақ жағдайды түзетуге көмектесетін стандартты кітапханалар бар: iconv және mbstring . тұрақты өрнектер үшін, қажетті өзгерткіш бар, ол модификатормен белсендіріледі.
Ал, деректер базасынан алынған деректер сценарий барлық ережелерге сәйкес жазылған. Дұрыс атауы жіберіп, бет кодын пайдаланушы браузерінде көрсету қалады. тақырыпты жібереміз:
header ('Content-Type: text / html; charset = utf-8');
егер бір байттық кодтау пайдаланылса, charset үшін мән әр түрлі болады - windows-1251 . Осыдан кейін проблемалар қалмауы керек.
Php-те utf-8-мен жұмыс істеудің қарапайым мысалдары:
мысал 1: iconv, әр жолдағы таңбалар саны
$ s = 'string'; # string utf-8 $ cnt1 = strlen ($ s); # $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8') мәнін қамтиды; # дұрыс мән, 6
2-мысал: mbstring, жолдағы таңбалардың саны
$ s = 'string'; # string utf-8 $ cnt1 = strlen ($ s); # $ 12 cnt2 = mb_strlen ($ s, 'UTF-8') мәнін қамтиды; # дұрыс мән, 6
3-мысал: тұрақты өрнектер, іздеу және ауыстыру
$ s = 'Жолақ'; # utf-8 $ s жолағы = preg_replace ('/ p / i', 'd', $ s); # ауыстыру болмайды $ s = preg_replace ('/ p / iu', 'd', $ s); # нәтиже сөз док
i модификаторы case-sensensitive іздеуді тағайындайды және u модификаторы тұрақты өрнек қозғалтқышын utf-8 жолдарымен жұмыс істеу туралы айтады.
егер біреу php utf-8-пен жұмыс істей алмайтынын айтса, қате болады. Бірнеше жыл бойы осы кодтамада барлық жобаларымды жасап жатырмын және ешқандай проблемалар болмады. Іздеу қозғалтқыштары осы тамаша кодтауды ұзақ уақыт пайдаланған.
Баспагер
11 сағ
x64 (aka andi)
Түсіндірмелер: 2846 Басылымдар: 395 Тіркелу: 02-04-2009
Сонымен, неге осындай проблема туындайды және оны қалай жеңуге болады?