ინფორმაციის კოდირების პრაქტიკული გამოყენება. ეროვნული ანბანების კოდირების გამოწვევები

კარგი დღე ყველას. ალექსეი გულინინი დაუკავშირდა. ბოლო სტატიაში ჩვენ განვიხილეთ ცხრილების შექმნა html-ში. ამ სტატიაში მინდა ვისაუბრო პრობლემაზე, რომელიც აუცილებლად შეგხვდებათ (თუ უკვე არ შეგხვედრიათ) თქვენს პრაქტიკაში. და ეს პრობლემა დაკავშირებულია კოდირება საიტზე. ეს სიტუაცია ხშირად ხდება: ზიხარ, რაღაცას იგონებ და ბოლოს შენი აზრები წერილობითი კოდით გამოიხატება. თქვენ ხსნით თქვენს ქმნილებას ბრაუზერში და იქ სრული სისულელეა დაწერილი, ან როგორც ამას ჩვეულებრივ სისულელეს უწოდებენ - "კრაკოზიაბრი". აქ ერთი რამ აშკარაა, ეს საიტზე კოდირების პრობლემა. სავარაუდოდ, თქვენი ნაგულისხმევი კოდირებაა windows-1251 (კირილიცა)და ბრაუზერი ცდილობს გახსნას თქვენი ფაილი utf-8 კოდირებით. მოკლედ რა არის კოდირება. კოდირება არის ერთგვარი ცხრილი, რომელიც ანიჭებს მანქანის კოდს თითოეულ სიმბოლოს. შესაბამისად, ჩვენს რუსულ ასოებს ერთ კოდირებაში აქვს ერთი კოდი, სხვებში - სხვა კოდი. მეგობრებო, ყველგან გამოიყენეთ utf-8 კოდირება და ბედნიერი იქნებით. Utf-8 ასევე მოუწოდა Unicode.

შევქმნათ სატესტო დოკუმენტი Notepad++-ში და დავწეროთ შემდეგი კოდი.

კოდირების პრობლემები

კოდირების პრობლემების ტესტირება



Notepad++ მენიუში დარწმუნდით, რომ "Encodings" არის ზედა - "Encode in ANSI". ახლა ხელოვნურად შეგიქმნით პრობლემას კოდირებასთან დაკავშირებით. სცადეთ ახლავე გახსნათ ეს ფაილი თქვენს ბრაუზერში. ჩვენ ვნახავთ იეროგლიფებს. აქ საქმე ის არის, რომ ჩვენ შევქმენით ჩვენი ფაილი ANSI (კირილიცას) კოდირებით და ბრაუზერს უთხრეს, რომ ჩვენი ფაილი იყო კოდირებით. utf-8 ( ) .

მიზეზები თუ რატომ საიტზე კოდირების პრობლემა:

1) მეტა ტეგის charset ატრიბუტის არასწორი მნიშვნელობა.

2) Notepad++ მენიუში შეამოწმეთ, რომ ფაილის კოდირება არის utf-8. ეს უნდა გაკეთდეს "კოდირება" - "დაშიფვრა UTF-8-ში (BOM-ის გარეშე)". ინტერნეტში შეგიძლიათ იპოვოთ განმარტება, თუ რა არის "BOM", მაგრამ ეს გაურკვეველია. როგორც მივხვდი, დოკუმენტის დასაწყისში არის უწყვეტი სივრცე ნულოვანი სიგანით. ჩვენ ეს არ გვჭირდება, ამიტომ ყოველთვის დააყენეთ "BOM-ის გარეშე".

3) ხდება ისე, რომ პირველი ორი პუნქტი დასრულებულია, მაგრამ სისულელე მაინც ჩნდება საიტის გვერდებზე. აქ პრობლემა შეიძლება იყოს სერვერის პარამეტრებში, ე.ი. ჰოსტინგი პირდაპირ გადასცემს სათაურებს ჩვენი ფაილებისთვის და ადგენს ნაგულისხმევ დაშიფვრას. მოდით ვეცადოთ, რომ მას ამისგან თავი დავანებოთ. საიტის root დირექტორიაში უნდა იყოს .htaccess ფაილი. ამ ფაილის გამოყენებით, შეგიძლიათ შეცვალოთ ჰოსტინგის ოპერაცია. თუ ეს ფაილი არ გაქვთ, მაშინ უნდა შექმნათ. ამის გაკეთება მოსახერხებელია Notepad++ რედაქტორში. ამ ფაილში თქვენ უნდა დაწეროთ შემდეგი კოდი:

AddDefaultCharset UTF-8

ამ ინსტრუქციით ჩვენ ვეუბნებით სერვერს, რომ ჩვენი ნაგულისხმევი კოდირება არის "utf-8". თუ ეს არ დაგვეხმარება, მაშინ თქვენ უნდა ჩაწეროთ შემდეგი კოდი იმავე ფაილში:

Charset გამორთულია AddDefaultCharset Off-ზე

აქ ჩვენ ვცდილობთ ვუთხრათ სერვერს, რომ არ გვინდა ნაგულისხმევი კოდირება. თუ ამ მაქინაციების შემდეგ არაფერი დაგვეხმარება, მაშინ თქვენ უნდა მიწეროთ მასტერს და მოაგვაროთ ეს პრობლემა მასთან. ალბათ ის გეტყვის რამეს.

დღეს კოდირება ASCIIარის სტანდარტი ინგლისური ანბანის პირველი 128 სიმბოლოს (მათ შორის რიცხვებისა და პუნქტუაციის) წარმოდგენისთვის, წარმოდგენილი კონკრეტული თანმიმდევრობით.

თუმცა, თუნდაც 1 ბაიტი საშუალებას გაძლევთ დაშიფვროთ 2-ჯერ მეტი მნიშვნელობები, ანუ არა 128, არამედ 256 სხვადასხვა მნიშვნელობა. ამიტომ, საკმარისად სწრაფად შეცვალოს ძირითადი ASCIIდაიწყო ამ ცნობილი და პოპულარული კოდირების უფრო გაფართოებული ვერსიების გამოჩენა, რომელშიც ასევე დაშიფრულია ანბანის სიმბოლოები და, შესაბამისად, სხვადასხვა ენების ტექსტი, მათ შორის რუსული.

ASCII გაფართოებები რუსეთისთვის

დღეს კოდირება პრიორიტეტულია რუსი მომხმარებლებისთვის Windows 1251და Unicode კოდირება, ასევე UTF 8რომელიც წარმოიშვა ASCII.

სინამდვილეში, ვინმეს შეიძლება ჰქონდეს ძალიან სამართლიანი შეკითხვა: "რატომ არის საჭირო ეს ტექსტის კოდირება საერთოდ?"
უნდა გვახსოვდეს, რომ კომპიუტერი მხოლოდ მანქანაა, რომელიც მკაცრად უნდა იმოქმედოს ინსტრუქციის მიხედვით. იმის გასაგებად, თუ რა უნდა გაკეთდეს თითოეულ დაწერილ სიმბოლოსთან, იგი წარმოდგენილია ვექტორული ფორმების ერთობლიობით, რომელთა თითოეული ნაკრები იგზავნება სწორ ადგილას ისე, რომ ეკრანზე გამოჩნდეს ერთი ან სხვა აღნიშვნა.

შრიფტები პასუხისმგებელნი არიან ვექტორული ფორმების ფორმირებაზე და თავად კოდირების პროცესი დამოკიდებულია ოპერაციულ სისტემაზე, ასევე მასში გამოყენებულ პროგრამებზე. ამრიგად, თითოეული ტექსტი თავისი არსით არის ბაიტების გარკვეული ნაკრები, თითოეული მათგანი წარმოადგენს ერთი დაწერილი სიმბოლოს დაშიფვრას. და პროგრამა, რომელიც აჩვენებს დაბეჭდილ ინფორმაციას ეკრანზე (ეს შეიძლება იყოს ბრაუზერი ან ტექსტის დამმუშავებელი) აანალიზებს კოდს, პოულობს შესაბამის ჩვენებას მისი კოდით კოდირების ცხრილში, გარდაქმნის მას საჭირო ვექტორულ ფორმაში და აჩვენებს მას ტექსტში. ფაილი.

კოდირება CP866 და KOI8-Rფართოდ გამოიყენებოდა გრაფიკული ოპერაციული სისტემის მოსვლამდე, რომელმაც პოპულარობა მოიპოვა მთელ მსოფლიოში - ფანჯრები. ახლა ყველაზე პოპულარული კოდირება, რომელიც მხარს უჭერს რუსულს, არის Windows 1251.

თუმცა, ეს არ არის ერთადერთი, რის გამოც პერიოდულად პროგრამულ უზრუნველყოფაში გამოყენებული რუსული შრიფტების მწარმოებლებს ჯერ კიდევ აქვთ სირთულეები, რომლებიც დაკავშირებულია სიმბოლოების არასწორ ჩვენებასთან და ე.წ. კრაკოზიაბრის გამოჩენასთან. ეს უხერხული იეროგლიფები კოდირების ცხრილების არასწორი გამოყენების შედეგია, ანუ კოდირებისა და დეკოდირების დროს გამოიყენებოდა სხვადასხვა ცხრილი.

იგივე სიტუაციაა ვებგვერდებზე, ბლოგებსა და სხვა რესურსებზე, სადაც არის ინფორმაცია რუსულ და სხვა უცხოურ სიმბოლოებზე, გარდა ინგლისურისა. ამ სიტუაციამ განსაზღვრა უნივერსალური კოდირების შექმნის მთავარი წინაპირობა, რომელიც საშუალებას გაძლევთ დაშიფროთ ტექსტი ნებისმიერ ენაზე, თუნდაც ჩინურ ენაზე, სადაც 256-ზე მნიშვნელოვნად მეტი სიმბოლოა.

უნივერსალური კოდირებები

უნივერსალური კოდირების პირველი ვერსია, რომელიც შეიქმნა უნიკოდის კონსორციუმში, იყო კოდირება UTF 32. თითოეული სიმბოლოს დაშიფვრისთვის გამოყენებული იყო 32 ბიტი. ახლა განხორციელდა უზარმაზარი რაოდენობის სიმბოლოების კოდირების შესაძლებლობა, მაგრამ გაჩნდა კიდევ ერთი პრობლემა - ევროპის ქვეყნების უმეტესობას არ სჭირდებოდა ასეთი რაოდენობის დამატებითი სიმბოლოები. საბუთები ხომ ძალიან მძიმე აღმოჩნდა. ამიტომ, ჩანაცვლება UTF 32მოვიდა UTF 16, რომელიც იქცა ჩვენს ქვეყანაში და მის ფარგლებს გარეთ გამოყენებული ყველა სიმბოლოს საფუძველი.

მაგრამ მაინც საკმაოდ ბევრი უკმაყოფილო იყო. მაგალითად, ისინი, ვინც კომუნიკაციას მხოლოდ ინგლისურად აკავშირებდა, გადართვის დღიდან ASCII UTF-მდე 16 მათი დოკუმენტები კვლავ გაიზარდა ზომით და მნიშვნელოვნად, თითქმის 2-ჯერ.
შედეგი იყო ცვლადი სიგრძის კოდირება UTF 8, რამაც შესაძლებელი გახადა ტექსტის წონა არ გამეზარდა.

კრაკოზიაბრი და მათთან გამკლავების მეთოდები

ზოგადად, კოდირება დაყენებულია იმ გვერდზე, სადაც თავად საინფორმაციო შეტყობინება იქმნება. შედეგად, დოკუმენტის დასაწყისში ყალიბდება ერთგვარი ნიშანი, რომელშიც ახსოვს, სიმბოლოების კოდები იწერება პირდაპირი თუ საპირისპირო თანმიმდევრობით. UTF16.

თუ რამე დაიბეჭდა UTF-8, მაშინ დასაწყისში მარკერი არ არის, რადგან ამ კოდირებაში სიმბოლოების კოდის საპირისპირო თანმიმდევრობით ჩაწერის შესაძლებლობა არ არსებობს.

ამიტომ, თქვენ უნდა შეინახოთ ყველაფერი, რაც აკრეფილია რედაქტორში, მარკერების გარეშე ( BOM) დოკუმენტში უაზრობის გაჩენის ალბათობის შესამცირებლად.

კრაკოზიაბრებთან საბრძოლველად კიდევ ერთი სასარგებლო რჩევაა საიტის თითოეული გვერდის კოდის სათაურში ჩაწეროთ ინფორმაცია სწორი ტექსტის კოდირების შესახებ, ისე რომ არ იყოს დაბნეულობა არც ლოკალურ ჰოსტზე და არც სერვერზე.

მაგალითად, ასე

  1. მაგალითისთვის ავიღოთ ჩვენი ვებგვერდი: www.yourmaster.ru
  2. საიტის ყველა ტექსტი იწერება და განთავსებულია საიტზე კოდირებით "Windows-1251"და ბრაუზერი ამის შესახებ არ არის ინფორმირებული
  3. ჰოსტინგის სერვერი ავტომატურად აგზავნის შემდეგ სათაურს ნაგულისხმევად:
    Content-Type: text/html; charset=utf-8

თუ ასეთი შეუსაბამობაა საიტის რეალურ დაშიფვრასა და სერვერის მიერ გაგზავნილ სათაურში დაშიფვრის ინფორმაციას, პრობლემები წარმოიქმნება საიტის გვერდების ჩვენებისას ვიზიტორების ბრაუზერში.

სწორი კოდირება ძალიან მნიშვნელოვანია!

შევეცადოთ ავხსნათ რატომ.

ზემოთ აღწერილი პარამეტრებით, მომხმარებლის ბრაუზერი ვერ შეძლებს ავტომატურად განსაზღვროს, თუ რა კოდირებით არის დაწერილი ნანახი საიტის ტექსტები. და, სავარაუდოდ, ის აჩვენებს გვერდებს წაუკითხავად. თუ ბრაუზერსა და თქვენს საიტს შორის ასეთ „არასწორ კომუნიკაციას“ წააწყდებით, მაშინ სასწრაფოდ უნდა მიიღოთ შესაბამისი ზომები. წინააღმდეგ შემთხვევაში, ეს დიდი ალბათობით გამოიწვევს სერიოზულ პრობლემებს.

ჯერ ერთი, ასეთ პირობებში და საიტის პარამეტრებში ვიზიტორებს მოუწევთ მუდმივად ხელით (შერჩევის მეთოდის გამოყენებით) მიუთითონ კოდირება ბრაუზერისთვის საიტის ჩვენებისთვის. ამას დასჭირდება მაუსის რამდენიმე დამატებითი დაწკაპუნება. მაგრამ უნდა აღიაროთ, რომ ყველას არ სურს მაუსის დამატებით 2-3 დაწკაპუნება მხოლოდ იმისთვის, რომ იხილოს ინფორმაცია გვერდზე წაკითხული ფორმით. უფრო მეტიც, ბევრმა არც კი იცის არა მხოლოდ როგორ შეცვალოს ეკრანის კოდირება ბრაუზერის პარამეტრებში, არამედ ზოგადად რა არის კოდირება! ვიზიტორთა უმეტესობამ შეიძლება გადაწყვიტოს, რომ საიტი მიატოვა მფლობელმა ან ვინმემ გატეხა და შეეცადოს აღარ დაუბრუნდეს მას.

მეორეც, თუ არსებობს საიტის გვერდის კოდირების ორაზროვანი განმარტება, საძიებო სისტემებმა შეიძლება სწორად არ მოახდინოს საიტის ტექსტის შინაარსის ინდექსირება. რაც თავის მხრივ იწვევს სერიოზულ პრობლემებს მომხმარებლის ტრაფიკთან საძიებო სისტემებიდან. რა თქმა უნდა, ზოგიერთი საძიებო სისტემა შეიძლება შეეცადოს როგორმე განსაზღვროს სწორი კოდირება გვერდების შინაარსიდან, მაგრამ ეს არ აადვილებს საქმეს. როგორც წესი, პრობლემა კვლავ რჩება.

იმედია მიხვდით, რომ კოდირებასთან დაკავშირებული პრობლემები შეიძლება გახდეს ძალიან სერიოზული დაბრკოლება საიტის ფუნქციონირებაში, მის განვითარებასა და მასში რეგულარული ვიზიტორების მოზიდვაში.

იმის უზრუნველსაყოფად, რომ კოდირების მსგავსი პრობლემები არ წარმოიქმნება, თქვენ უნდა გააკეთოთ შესაბამისი პარამეტრები როგორც ჰოსტინგის სერვერზე, ასევე საიტის გვერდებზე.

საიტის პარამეტრები უნდა იყოს ისეთი, რომ ნებისმიერ ბრაუზერს ან ნებისმიერ საძიებო სისტემას რობოტს შეეძლოს უსათუოდ განსაზღვროს, თუ რა კოდირებით არის გადაცემული საიტიდან ინფორმაცია!

საიტის კოდირების პრობლემის გადაჭრა

ჩვენ უკვე შევამჩნიეთ, რომ ჩვენს საიტზე ყველა ტექსტი იწერება და გადაეცემა საიტის ვიზიტორების ბრაუზერს "windows-1251" კოდირებით. რა შეგვიძლია გავაკეთოთ იმისთვის, რომ სერვერმა, რომელზეც ჩვენი საიტია განთავსებული, გადასცეს სწორი კოდირების ინფორმაცია ბრაუზერს სათაურში? განვაგრძოთ თანმიმდევრობით...

1. იმისათვის, რომ არ იყოს დამოკიდებული სერვერის პარამეტრებზე, საიტის ყველა გვერდზე, პირდაპირ HTML კოდში, თქვენ უნდა დაწეროთ შემდეგი დირექტივა მეტა ტეგის გამოყენებით:

ის უნდა განთავსდეს ყველა გვერდზე, სასურველია დაუყოვნებლივ გახსნის ტეგის შემდეგ . ეს საშუალებას მისცემს ბრაუზერს ავტომატურად შეარჩიოს ეკრანის სწორი კოდირება მიღებული დირექტივის შესაბამისად გვერდის ჩატვირთვისა და ინტერპრეტაციისას! მხოლოდ ეს დირექტივა საკმარისი უნდა იყოს ჩვენი პრობლემის მოსაგვარებლად. მაგრამ ეს ასე იყო გამიზნული თეორიულად. მაგრამ პრაქტიკაში, ეს დირექტივა ყოველთვის არ არის საკმარისი. იშვიათ შემთხვევებში, მაგრამ ხდება ისე, რომ ბრაუზერი გვერდის ჩვენების კოდირებად ირჩევს არა თავად გვერდზე დირექტივაში მითითებულს, არამედ სერვერიდან სათაურში გადაცემულს! და თუ ორ ადგილას მითითებული კოდირების ინფორმაცია არ ემთხვევა, მაშინ პრობლემა შეიძლება დარჩეს.

2. ისე, რომ სერვერმა მის პასუხში სწორი კოდირების ინფორმაცია მისცეს, თქვენ უნდა შექმნათ ფაილი თქვენი საიტის ძირში .htaccessდა ჩაწერეთ მასში დირექტივა:

AddDefaultCharset windows-1251

შემდეგ სერვერი განაგრძობს კოდირების სათაურის გაგზავნას ნაგულისხმევად, მაგრამ კოდირების სახელი ემთხვევა იმ სახელს, რომელიც მოქმედებს თავად საიტზე. სახელების შეუსაბამობა აღარ იქნება.

თუ ფაილი .htaccessუკვე არსებობს თქვენს სერვერზე, შემდეგ უბრალოდ დაამატეთ მითითებული დირექტივა, მაგალითად, თავიდანვე. და არავითარ შემთხვევაში არ წაშალოთ მასში უკვე არსებული ინფორმაცია!

ეს არის პრობლემის გადაწყვეტა. დამეთანხმებით, ეს ყველაფერი არც ისე რთულია?! მაგრამ ეს ძალიან სასარგებლოა ყბადაღებული კოდირების ყველა სახის პრობლემის თავიდან ასაცილებლად.

ზემოთ ჩამოთვლილი ორი რეკომენდაციის ზედიზედ დაცვით, ბრაუზერები ნამდვილად ვერ შეძლებენ შეცდომებს თქვენს ვებსაიტზე ინფორმაციის ჩვენებისთვის სწორი კოდირების ავტომატურად არჩევისას. ყოველივე ამის შემდეგ, ჩვენ მივუთითეთ კოდირების ინფორმაცია ცალსახად, სწორად და თუნდაც ორ სხვადასხვა დირექტივაში!

განსაკუთრებული სიტუაციები

სიტუაცია ერთი

ვებსაიტების შემქმნელები და უფრო ხშირად თავად მომხმარებლებიც კი, თვითნებურად და დაუფიქრებლად იწყებენ ვებსაიტზე გარკვეული ცვლილებების შეტანას, ტექსტების განთავსებას ისე, როგორც მათ სურთ და ა.შ. სექციები ინფორმაციის სხვადასხვა კოდირებით. ჩვენ ვერ ვიტყვით, რომ ეს სწორი მიდგომაა, მაგრამ ჩვენ ავიცილებთ იმ ფაქტს, რომ ეს ხდება და ეს არის. ამ შემთხვევაში, მაშინაც კი, თუ ზემოთ ჩამოთვლილ ორ რეკომენდაციას მივყვებით, მაინც შეიძლება შეიქმნას სიტუაცია, როდესაც სერვერი გვაწვდის ინფორმაციას ერთი კოდირების შესახებ, ხოლო მეორე კოდირება აშკარად არის დაწერილი გვერდის HTML კოდში. ასეთ შემთხვევაში, ალბათ ყველაზე მარტივი გამოსავალი იქნება შემდეგი.

ჩაწერეთ ფაილში .htaccessდირექტივა:

AddDefaultCharset გამორთულია

ამ დირექტივის გამოყენებისას, სერვერი უბრალოდ არ გამოგიგზავნით სათაურს ინფორმაციის გადაცემული გვერდის კოდირების შესახებ. შემდეგ ბრაუზერები დაიწყება კოდირების მონაცემებიდან, რაც პირდაპირ არის მითითებული HTML კოდში თავად საიტის გვერდებზე. უფრო მეტიც, ერთ გვერდზე მონაცემები შეიძლება იყოს კოდირებული windows-1251და სხვა გვერდზე, მაგალითად, in utf-8. მთავარია, არ დაგავიწყდეთ ამ გვერდებზე მიუთითოთ შესაბამისი მეტა ტეგები ბრაუზერის მიერ ტექსტის ამოცნობისა და ჩვენებისთვის სწორი კოდირების შესახებ ინფორმაციის მითითებით.

მიუხედავად იმისა, რომ ასეთი გამოსავალი ყველაზე მარტივია, ის, ალბათ, არ არის ყველაზე ოპტიმალური და სწორი. კარგი თვალსაზრისით, თქვენ უნდა განათავსოთ ყველა ინფორმაცია საიტზე და საიტის ყველა განყოფილებაში ერთი და იგივე კოდირებით! და თუ რამდენიმე გვერდია სხვადასხვა კოდირებით, მაშინ უმჯობესია განაახლოთ მათში არსებული ინფორმაცია ყველა ტექსტის საჭირო დაშიფვრაში გადაყვანით.

სიტუაცია ორი

მოგეხსენებათ, გვერდების გენერირებისას საიტების უმეტესობა ირჩევს მონაცემთა ნაწილს მონაცემთა ბაზიდან, მაგალითად, MySQL (თუ საიტი დაწერილია PHP-ით). ხშირად, ზევებსაიტის გადატანა ერთი ჰოსტინგიდან მეორეზე, პრობლემები შეიძლება წარმოიშვას კოდირების შეუსაბამობის გამო MySQL მონაცემთა ბაზაში შენახულ და შენახულ მონაცემებს შორის, მაგალითად, უშუალოდ საიტის შაბლონებში. ამრიგად, შეიძლება შეიქმნას სიტუაცია, რომ ერთი გვერდის შექმნისას ის შეიძლება შეიცავდეს მონაცემებს სხვადასხვა კოდირებით. ეს არის ალბათ ერთ-ერთი ყველაზე სერიოზული კოდირების შეცდომა ვებსაიტზე და დაუყოვნებლივ უნდა მოგვარდეს. წინააღმდეგ შემთხვევაში, დამატებითი სირთულეები შეიძლება მოგვიანებით წარმოიშვას საიტის შევსების და რედაქტირებისას.

მონაცემთა ბაზაში შენახულ მონაცემებთან ასეთი უთანხმოების მოგვარება მიიღწევა კოდირების პარამეტრების სწორად დაყენებით მონაცემთა ბაზასთან დაკავშირებისას და მისგან მონაცემების მოძიებამდე. მაგალითად, თუ ჩვენს ვებსაიტზე მონაცემები ინახება windows-1251 კოდირებით, მაშინ ჩვენ უნდა წავიკითხოთ მონაცემები მონაცემთა ბაზიდან იმავე კოდირებით. ამისათვის, მონაცემთა ბაზასთან დაკავშირების შემდეგ PHP ფუნქციის mysql_connect() (ან mysql_pconnect()) გაუშვით შემდეგი SQL მოთხოვნა:

mysql_query ("SET NAMES cp1251");

ეს მოთხოვნა ეუბნება MySQL მონაცემთა ბაზის სერვერს, რომ ყველა მონაცემი ინახება და უნდა გადაიცეს cp1251 კოდირებით (ეს არის კოდირების სახელი, რომელიც გამოიყენება MySQL-ში, ნაცვლად ადრე ნახსენები Windows-1251 სახელისა, რომელიც გამოიყენება HTML მონაცემების გადაცემისას).

მაგრამ უმჯობესია შეცვალოთ მონაცემების კოდირება MySql მონაცემთა ბაზაში იმით, რომელიც გამოიყენება თავად საიტზე. მაშინ მონაცემთა ბაზის სერვერს არ მოუწევს არასაჭირო ოპერაციის შესრულება მონაცემთა ერთი ფორმატიდან მეორეში გადასაყვანად.

შენიშვნაზე

თუ თქვენ ეწვიეთ საიტს, რომლის კოდირებამ რაიმე მიზეზით შეფერხდა, მაგრამ ნამდვილად გჭირდებათ მასზე სასარგებლო ინფორმაციის მიღება (საიტის დეველოპერების მიერ ზემოთ ჩამოთვლილი რეკომენდაციების შესრულებას არ დაელოდებით), მაშინ ხელით უნდა მიუთითოთ სწორი გვერდის კოდირება. თქვენი ბრაუზერის პარამეტრებში. ეს ჩვეულებრივ შეიძლება გაკეთდეს ბრაუზერის მთავარი მენიუდან: ხედი -> კოდირება-> შემდეგი, აირჩიეთ სიიდან განკუთვნილი გვერდის კოდირების სახელი. ალბათ, გამოსაცნობად, მოგიწევთ ამ პროცედურის გაკეთება არაერთხელ, კოდირების სიიდან ამა თუ იმ სახელის არჩევით. შერჩევის პროცესის დასაჩქარებლად, ჩვენ გირჩევთ გაეცნოთ მათ შემდეგი თანმიმდევრობით: კირილიცა (Windows-1251), კირილიცა (UTF-8), კირილიცა (KOI)8-R). ეს არის ყველაზე ხშირად გამოყენებული კოდირები RuNet-ის ვებსაიტებზე.

თუ კოდირება არასწორია, მთელი საიტი ან მისი ნაწილი ნაჩვენებია როგორც "kryapozyablov", ე.ი. უცნაური სიმბოლოები, რომლებიც ტექსტს წასაკითხად ხდის. ეს სიტუაცია შეიძლება მოხდეს, თუ ვებ სერვერის კოდირება არასწორად არის კონფიგურირებული ან თუ არ არის პარამეტრები. განვიხილოთ პრობლემების გადაჭრის შესაძლო ვარიანტები და გზები

არასწორი HTML გვერდის კოდირება

მოდით შევქმნათ სატესტო ფაილი:

Sudo gedit /var/www/html/encoding.html

მოდით დავაკოპიროთ მასში:

კოდირების შემოწმება



მოდით გავხსნათ ეს ფაილი ბრაუზერში

როგორც ხედავთ, კოდირება არასწორად არის აღმოჩენილი ბრაუზერის მიერ:

ამ სიტუაციის გამოსწორების რამდენიმე გზა არსებობს. დავიწყოთ უმარტივესი რამით - პირდაპირ მიუთითეთ ვებ გვერდის კოდირება. ეს კეთდება მეტა ტეგით, რომელიც უნდა იყოს განთავსებული ტეგის შიგნით თავი:

მოდით დავამატოთ ეს ხაზი ჩვენს სატესტო ფაილს, ასე რომ ასე გამოიყურებოდეს:

კოდირების შემოწმება

სატესტო ფაილი კოდირების შესამოწმებლად



როგორც ვხედავთ შემდეგ ეკრანის სურათზე, პრობლემა მოგვარებულია:

თუ თქვენი ფაილის კოდირება განსხვავდება UTF-8, შემდეგ შეცვალეთ იგი windows-1251ან ის, რომელიც ემთხვევა ვებ გვერდის დაშიფვრას. იმის გასაგებად, თუ როგორ ამოიცნოთ ფაილის კოდირება, შეხედეთ.

ეს იყო ყველაზე მარტივი გზა კოდირების პრობლემის გადასაჭრელად - სერვერის პარამეტრების შეცვლის გარეშე.

მოდით დავაბრუნოთ ჩვენი სატესტო ფაილი პირვანდელ მდგომარეობაში და გავაგრძელოთ კოდირების მითითების გზების შესწავლა.

თუ ფაილები .htaccessჩართულია Apache-ის პარამეტრებით, ეს ფაილები შეიძლება გამოყენებულ იქნას ვებ სერვერის მიერ გაგზავნილი გვერდების კოდირების დასაზუსტებლად. ფაილის მხარდაჭერის გასააქტიურებლად .htaccess Apache კონფიგურაციის ფაილში ( /etc/apache2/apache2.conf) იპოვნეთ ხაზების ჯგუფი

ოფციები ინდექსები FollowSymLinks AllowOverride None მოითხოვოს ყველა მინიჭებული

და შეცვალეთ იგი

Allow Override None

AllowOverride All

ამის შემდეგ საჭიროა სერვერის გადატვირთვა.

Sudo systemctl გადატვირთეთ apache2.service

ფაილი .htaccessუნდა განთავსდეს იმავე დირექტორიაში, როგორც საიტი. ჩემი საიტი მასპინძლობს ვებ სერვერის ძირეულ დირექტორიაში. თუ თქვენ გაქვთ იგივე, მაშინ ახლა საქაღალდეში /var/www/html/შექმენით ფაილი .htaccessდა დაამატეთ მას დირექტივა AddDefaultCharsetრის შემდეგაც მიუთითეთ სასურველი კოდირება. მაგალითები

AddDefaultCharset UTF-8

AddDefaultCharset windows-1251

თქვენ შეგიძლიათ მიუთითოთ კოდირება, რომელიც გამოყენებული იქნება მხოლოდ გარკვეული ფორმატის ფაილებზე:

AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

ფაილების ნაკრები შეიძლება იყოს ნებისმიერი, მაგალითად:

AddCharset utf-8 .html .css .php .txt .js

შემდეგი ვარიანტი არის ალტერნატივა და ასევე საშუალებას გაძლევთ დააყენოთ კოდირება გარკვეული ტიპის ფაილებისთვის mod_headers:

სათაურის ნაკრები Content-Type "text/html; charset=utf-8"

კიდევ ერთი ვარიანტი, რომელიც ასევე შეიძლება გამოყენებულ იქნას ფაილში .htaccess UTF-8 კოდირების დასაყენებლად:

IndexOptions + Charset=UTF-8

თუ საიტი არის PHP-ში, მაშინ შეიძლება დამატებით დაგჭირდეთ კოდირების დუბლიკატი php_value default_charset:

AddDefaultCharset windows-1251 php_value default_charset "cp1251"

.htaccess ფაილის შექმნის ნაცვლად, შეგიძლიათ დააყენოთ კოდირება ვებ სერვერის კონფიგურაციის ფაილში. Apache CentOS/Fedora-სთვის ეს არის httpd.conf ფაილი, ხოლო Debian/Ubuntu-ზე ეს არის apache2.conf ფაილი. დაამატეთ შემდეგი ხაზი კოდირების დასაყენებლად და გადატვირთეთ ვებ სერვერი ცვლილებების ამოქმედებისთვის:

AddDefaultCharset UTF-8

როგორ დავაყენოთ UTF-8 კოდირება PHP-ში

PHP სკრიპტში კოდირება დაყენებულია სათაური, Მაგალითად:

Header("Content-Type: charset=utf-8");

ჩვეულებრივ, კოდირებასთან ერთად, მითითებულია შინაარსის ტიპიც (მაგალითად, HTML გვერდის ვარიანტი):

Header("შინაარსის ტიპი: text/html; charset=utf-8");

RSS არხის კიდევ ერთი ვარიანტი:

Header("კონტენტის ტიპი: text/xml; charset=utf-8");

გახსოვდეთ, რომ ფუნქცია სათაურიუნდა გამოიძახოთ ბრაუზერში რაიმე გამოსვლამდე. წინააღმდეგ შემთხვევაში (თუ ბრაუზერში გამომავალი უკვე გაკეთდა), მაშინ სათაურები უკვე გაგზავნილია. ცხადია, ამ შემთხვევაში მათი შეცვლა აღარ არის შესაძლებელი. თუ შეცდომის შეტყობინება გამოვიდა ბრაუზერში, მაშინ სათაურები უკვე გაგზავნილია და სათაურის გამოყენება გამოიწვევს შეცდომას. იმისათვის, რომ შეამოწმოთ არის თუ არა სათაურები უკვე გაგზავნილი, გამოიყენეთ სათაურები_გაგზავნილი.

აღწერილი მეთოდი მუშაობს მხოლოდ მაშინ, როდესაც PHP სკრიპტი მთლიანად წარმოქმნის გვერდის შინაარსს. თქვენ უნდა შეინახოთ სტატიკური გვერდები (როგორიცაა html) utf-8 კოდირებით. ვებ სერვერების უმეტესობა გაითვალისწინებს ფაილის დაშიფვრას და შესაბამისად დაამატებს სათაურს. სინამდვილეში, PHP ფაილის შენახვა utf-8 კოდირებით გამოიწვევს იგივე შედეგს.

MySQL მონაცემთა ბაზის შედეგების არასწორი კოდირება

თუ თქვენი საიტი შედგება სტატიკური ნაწილისგან (თარგი) და დინამიური ნაწილისგან, რომელიც იქმნება მონაცემთა ბაზიდან მიღებული მონაცემებით, მაშინ შეიძლება შეიქმნას სიტუაცია, როდესაც საიტის ნაწილს აქვს სწორი კოდირება, ხოლო საიტის მეორე ნაწილს აქვს არასწორი. ერთი. ამ შემთხვევაში, უსარგებლოა ვებ სერვერის პარამეტრების შეცვლა - რადგან მაინც, გვერდის ნაწილს არასწორი კოდირება ექნება.

თქვენ უნდა დაიწყოთ თქვენი ცხრილების კოდირების განსაზღვრით. შეგიძლიათ შეხედოთ phpMyAdmin:

ყურადღება მიაქციეთ სვეტს " შედარება", შესვლა" utf8_unicode_ci"ნიშნავს, რომ კოდირება გამოიყენება UTF-8.

შეგიძლიათ დაუკავშირდეთ MySQL DBMS-ს და შეამოწმოთ ცხრილების კოდირება phpMyAdmin-ის გარეშე. Ამისთვის:

Mysql -u root -p

თუ დაგავიწყდათ მონაცემთა ბაზის სახელი, გაუშვით ბრძანება:

მონაცემთა ბაზების ჩვენება;

ვთქვათ, მინდა მოვძებნო ცხრილების კოდირება ინფორმაციის_სქემის მონაცემთა ბაზაში

ინფორმაციის_სქემის გამოყენება;

თუ დაგავიწყდათ ცხრილების სახელები, გაუშვით:

სრული სვეტების ჩვენება ცხრილის_სახელიდან;

Მაგალითად:

სრული სვეტების ჩვენება GLOBAL_STATUS-დან;

თქვენ ნახავთ ასეთ რამეს:

იხილეთ სვეტი შეკრება. ჩემს შემთხვევაში იქ utf8_general_ci, ის მსგავსია utf8_unicode_ci, კოდირება UTF-8. სხვათა შორის, თუ არ იცით რა განსხვავებაა დაშიფვრებს შორის utf8_general_ci, utf8_unicode_ci, utf8mb4_general_ci, utf8mb4_unicode_ciდა ასევე რა კოდირება უნდა აირჩიოთ MySQL მონაცემთა ბაზისთვის, შემდეგ ნახეთ.

ახლა, როდესაც ჩვენ ვიცით კოდირება (ჩემს შემთხვევაში ეს არის UTF-8), ყოველ ჯერზე, როდესაც თქვენ დაუკავშირდებით MySQL DBMS-ს, თქვენ უნდა შეასრულოთ მოთხოვნები თანმიმდევრულად:

SET NAMES UTF8 SET CHARACTER SET UTF8 SET character_set_client = UTF8 SET character_set_connection = UTF8 SET character_set_results = UTF8

PHP-ში ეს შეიძლება გაკეთდეს ასე:

$this->mysqli = new mysqli($server, $username, $password, $basename); if ($this->mysqli->connect_error) ( $this->errorHandler_c->logError(1, "Connect Error (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error , $_SERVER ["REQUEST_URI"] ) $this->mysqli->query("SET NAMES UTF8"); $this->mysqli->query("SET CHARACTER SET UTF8"); $this->mysqli->query("SET character_set_client = UTF8"); $this->mysqli->query ("SET character_set_connection = UTF8"); $this->mysqli->query("SET character_set_results = UTF8");

გაითვალისწინე UTF8თქვენ უნდა შეცვალოთ ის კოდირებით, რომელიც გამოიყენება თქვენი ცხრილებისთვის.

ფაილის კოდირების შეცვლა

თუ გადაწყვეტთ სხვა გზით წასვლას და ახალი კოდირების დაყენების ნაცვლად, შეცვალეთ თქვენი ფაილების კოდირება, შემდეგ გადახედეთ სტატიას "". ის გეტყვით, თუ როგორ უნდა გაიგოთ ფაილების მიმდინარე კოდირება და როგორ გადაიყვანოთ ფაილები ნებისმიერ დაშიფვრაში (არა მხოლოდ UTF-8).

როგორ გავარკვიოთ, რა კოდირებას აგზავნის სერვერი

თუ გსურთ გაიგოთ, რა კოდირების პარამეტრები აქვს ვებ სერვერს (რა კოდირებას აგზავნის სათაურებში), გამოიყენეთ შემდეგი ბრძანება:

Curl URL -s -o /dev/null -D /dev/stdout | grep -E "charset"

მასში ნაცვლად URLჩადეთ იმ საიტის რეალური მისამართი, რომელსაც ამოწმებთ. თუ საიტი იყენებს HTTPS, მაშინ მიუთითეთ საიტის მისამართი პროტოკოლთან ერთად, მაგალითად

Curl https://softocracy.ru -s -o /dev/null -D /dev/stdout | grep -E "charset"

რომელი კოდირება აირჩიოს ვებსაიტისთვის

ნებისმიერი რიცხვი (გარკვეულ საზღვრებში) კომპიუტერის მეხსიერებაში დაშიფრულია, როგორც რიცხვები ბინარული რიცხვების სისტემაში. ამისათვის არსებობს მარტივი და მკაფიო თარგმანის წესები. თუმცა, დღეს კომპიუტერი ბევრად უფრო ფართოდ გამოიყენება, ვიდრე როგორც შრომატევადი გამოთვლების შემსრულებელი. მაგალითად, ტექსტი და მულტიმედიური ინფორმაცია ინახება კომპიუტერის მეხსიერებაში. ამიტომ ჩნდება პირველი კითხვა:

როგორ ინახება სიმბოლოები (ასოები) კომპიუტერის მეხსიერებაში?

თითოეული ასო მიეკუთვნება კონკრეტულ ანბანს, რომელშიც სიმბოლოები მიჰყვება ერთმანეთს და, შესაბამისად, შეიძლება დაინომროს თანმიმდევრული მთელი რიცხვებით. თითოეული ასო შეიძლება ასოცირებული იყოს დადებით მთელ რიცხვთან და ეწოდოს მისი სიმბოლოს კოდი.სწორედ ეს კოდი შეინახება კომპიუტერის მეხსიერებაში და ეკრანზე ან ქაღალდზე გამოტანისას ის "კონვერტირდება" შესაბამის სიმბოლოში. იმისათვის, რომ განასხვავოთ რიცხვების წარმოდგენა კომპიუტერის მეხსიერებაში სიმბოლოების წარმოდგენისგან, ასევე აუცილებელია ინფორმაციის შენახვა იმის შესახებ, თუ რა მონაცემებია კოდირებული მეხსიერების კონკრეტულ ზონაში.

გარკვეული ანბანის ასოების შესაბამისობა კოდირებულ რიცხვებთან ქმნის ეგრეთ წოდებულ კოდირების ცხრილს. სხვა სიტყვებით რომ ვთქვათ, კონკრეტული ანბანის თითოეულ სიმბოლოს აქვს თავისი რიცხვითი კოდი გარკვეულის შესაბამისად კოდირების ცხრილი.

თუმცა, მსოფლიოში უამრავი ანბანი არსებობს (ინგლისური, რუსული, ჩინური და ა.შ.). ასე რომ შემდეგი კითხვაა:

როგორ დავაშიფროთ კომპიუტერში გამოყენებული ყველა ანბანი?

ამ კითხვაზე პასუხის გასაცემად, ისტორიული მარშრუტი ავიღოთ.

მე-20 საუკუნის 60-იან წლებში ამერიკის ეროვნულმა სტანდარტების ინსტიტუტმა (ANSI) შეიმუშავა სიმბოლოების კოდირების ცხრილი, რომელიც შემდგომში გამოიყენებოდა ყველა ოპერაციულ სისტემაში. ამ ცხრილს ეწოდება ASCII (ამერიკული სტანდარტული კოდი ინფორმაციის ურთიერთგაცვლისთვის). ცოტა მოგვიანებით, ASCII-ის გაფართოებული ვერსია გამოჩნდა.

ASCII კოდირების ცხრილის შესაბამისად, 1 ბაიტი (8 ბიტი) გამოყოფილია ერთი სიმბოლოს წარმოსაჩენად. 8 უჯრედის კომპლექტს შეუძლია მიიღოს 28 = 256 განსხვავებული მნიშვნელობა. პირველი 128 მნიშვნელობა (0-დან 127-მდე) მუდმივია და წარმოადგენს ცხრილის ეგრეთ წოდებულ ძირითად ნაწილს, რომელიც მოიცავს ათობითი რიცხვებს, ლათინური ანბანის ასოებს (ზედა და პატარა), პუნქტუაციის ნიშნებს (წერტილი, მძიმე, ფრჩხილები). და ა.შ.), ასევე სივრცეები და სხვადასხვა სერვისის სიმბოლოები (ჩანართი, ხაზის მიწოდება და ა.შ.). მნიშვნელობები 128-დან 255-მდე ქმნის ცხრილის დამატებით ნაწილს, სადაც ჩვეულებრივია ეროვნული ანბანის სიმბოლოების კოდირება.

ვინაიდან ამდენი ეროვნული ანბანია, გაფართოებული ASCII ცხრილები მრავალ ვარიანტში მოდის. რუსული ენისთვისაც კი არსებობს რამდენიმე კოდირების ცხრილი (Windows-1251 და Koi8-r გავრცელებულია). ეს ყველაფერი დამატებით სირთულეებს ქმნის. მაგალითად, ჩვენ ვაგზავნით წერილს, რომელიც დაწერილია ერთ კოდირებით, ხოლო მიმღები ცდილობს წაიკითხოს იგი მეორეში. შედეგად, ის ხედავს კრაკოზიაბრს. ამიტომ, მკითხველმა უნდა გამოიყენოს სხვა კოდირების ცხრილი ტექსტისთვის.

სხვა პრობლემაა. ზოგიერთი ენის ანბანს აქვს ძალიან ბევრი სიმბოლო, რათა მოერგოს მათ დანიშნულ პოზიციებს 128-დან 255-მდე ერთ ბაიტიანი სიმბოლოების ნაკრებიდან.

მესამე პრობლემა არის რა უნდა გააკეთოს, თუ ტექსტი იყენებს რამდენიმე ენას (მაგალითად, რუსული, ინგლისური და ფრანგული)? ორი მაგიდის ერთდროულად გამოყენება არ შეიძლება...

ამ პრობლემების ერთდროულად გადასაჭრელად შეიქმნა Unicode.

Unicode სიმბოლოების კოდირების სტანდარტი

ზემოაღნიშნული პრობლემების გადასაჭრელად, 90-იანი წლების დასაწყისში შეიქმნა სიმბოლოების კოდირების სტანდარტი, ე.წ Unicode. ეს სტანდარტი საშუალებას გაძლევთ გამოიყენოთ თითქმის ნებისმიერი ენა და სიმბოლო ტექსტში.

Unicode უზრუნველყოფს 31 ბიტს (4 ბაიტი გამოკლებული ერთი ბიტი) სიმბოლოების კოდირებისთვის. შესაძლო კომბინაციების რაოდენობა იძლევა წარმოუდგენელ რიცხვს: 231 = 2,147,483,684 (ანუ ორ მილიარდზე მეტი). მაშასადამე, უნიკოდში აღწერილია ყველა ცნობილი ენის ანბანი, თუნდაც „მკვდარი“ და ფიქტიური, და მოიცავს ბევრ მათემატიკურ და სხვა სპეციალურ სიმბოლოებს. თუმცა, 31-ბიტიანი უნიკოდის საინფორმაციო მოცულობა ჯერ კიდევ ძალიან დიდია. ამიტომ უფრო ხშირად გამოიყენება შემცირებული 16-ბიტიანი ვერსია (216 = 65,536 მნიშვნელობები), სადაც ყველა თანამედროვე ანბანი დაშიფრულია.

უნიკოდში პირველი 128 კოდი იგივეა, რაც ASCII ცხრილი.



გაქვთ შეკითხვები?

შეატყობინეთ შეცდომას

ტექსტი, რომელიც გაეგზავნება ჩვენს რედაქტორებს: