PHP Metin Kodlama Belirleme - Mevcut çözümlere genel bakış ve bir bisiklet daha. PHP'de metin kodlamasını tanımlama - mevcut çözümlere genel bakış ve dize kodlamasını utf 8'e dönüştüren başka bir Php bisikleti

  • 20.06.2020

Görevle karşı karşıya - sayfa/metin/kodlama ne olursa olsun otomatik algılama. Görev yeni değil ve birçok bisiklet zaten icat edildi. Makale, internette bulunanlara dair küçük bir genel bakış - artı bana göründüğü gibi, değerli bir çözüm gibi kendi teklifimi içeriyor.

1. Neden mb_detect_encoding() değil?

Kısacası çalışmıyor.

Hadi izleyelim:
// Girişte - CP1251'de kodlanmış Rusça metin $string = iconv("UTF-8", "Windows-1251", "Anna Pavlovna'ya yaklaştı, elini öptü, parfümlü ve parlayan kel kafasını ona uzattı ve sakince oturdu kanepede."); // Bakalım md_detect_encoding() bize ne veriyor. İlk $strict = FALSE var_dump(mb_detect_encoding($string, array("UTF-8"))); // UTF-8 var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251"))); // Windows-1251 var_dump(mb_detect_encoding($string, array("UTF-8", "KOI8-R"))); // KOI8-R var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251", "KOI8-R"))); // YANLIŞ var_dump(mb_detect_encoding($string, array("UTF-8", "ISO-8859-5"))); // ISO-8859-5 var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251", "KOI8-R", "ISO-8859-5"))); // ISO-8859-5 // Şimdi $katı = DOĞRU var_dump(mb_detect_encoding($string, array("UTF-8"), DOĞRU)); // YANLIŞ var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251"), DOĞRU)); // YANLIŞ var_dump(mb_detect_encoding($string, array("UTF-8", "KOI8-R"), DOĞRU)); // YANLIŞ var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251", "KOI8-R"), DOĞRU)); // YANLIŞ var_dump(mb_detect_encoding($string, array("UTF-8", "ISO-8859-5"), DOĞRU)); // ISO-8859-5 var_dump(mb_detect_encoding($string, array("UTF-8", "Windows-1251", "KOI8-R", "ISO-8859-5"), DOĞRU)); // ISO-8859-5
Gördüğünüz gibi, çıktı tam bir karmaşa. Bir fonksiyonun neden bu şekilde davrandığını anlamadığımızda ne yaparız? Bu doğru, biz google. Harika bir cevap buldum.

Sonunda mb_detect_encoding() kullanma umutlarını ortadan kaldırmak için mbstring uzantısının kaynaklarına girmeniz gerekir. O halde kollarınızı sıvayın, gidelim:
// ext/mbstring/mbstring.c:2629 PHP_FUNCTION(mb_detect_encoding) ( ... // satır 2703 ret = mbfl_identify_encoding_name(&string, elist, size, strict); ...
Ctrl+tıklama:
// ext/mbstring/libmbfl/mbfl/mbfilter.c:643 const char* mbfl_identify_encoding_name(mbfl_string *dize, enum mbfl_no_encoding *elist, int elistsz, int strict) ( const mbfl_encoding *kodlama; kodlama = mbfl_identify_encoding( , sıkı); ...
Ctrl+tıklama:
// ext/mbstring/libmbfl/mbfl/mbfilter.c:557 /* * kodlamayı tanımla */ const mbfl_encoding * mbfl_identify_encoding(mbfl_string *string, enum mbfl_no_encoding *elist, int elistsz, int strict) ( ...
Makaleyi gereksiz kaynaklarla tıkamamak için yöntemin tam metnini yayınlamayacağım. İlgilenenler kendileri göreceklerdir. Karakterin kodlamaya uyup uymadığının gerçekten kontrol edildiği 593 numaralı satırla ilgileneceğiz:
// ext/mbstring/libmbfl/mbfl/mbfilter.c:593 (*filter->filtre_fonksiyonu)(*p, filtre); if (filtre->bayrak) ( bad++; )
Tek baytlık Kiril alfabesi için ana filtreler şunlardır:

Windows-1251 (orijinal yorumlar korunmuştur)
// ext/mbstring/libmbfl/filters/mbfilter_cp1251.c:142 /* bunların hepsi şimdi çok çirkin! */ static int mbfl_filt_ident_cp1251(int c, mbfl_identify_filter *filtre) ( if (c >= 0x80 && c)< 0xff) filter->bayrak = 0; başka filtre->

KOI8-R
// ext/mbstring/libmbfl/filters/mbfilter_koi8r.c:142 static int mbfl_filt_ident_koi8r(int c, mbfl_identify_filter *filtre) ( if (c >= 0x80 && c)< 0xff) filter->bayrak = 0; else filtre->bayrak = 1; /* değil */ c döndür; )

ISO-8859-5 (burada her şey genellikle eğlencelidir)
// ext/mbstring/libmbfl/mbfl/mbfl_ident.c:248 int mbfl_filt_ident_true(int c, mbfl_identify_filter *filtre) ( dönüş c; )
Gördüğünüz gibi, ISO-8859-5 her zaman DOĞRU döndürür (YANLIŞ döndürmek için filtre->bayrak = 1 ayarlamanız gerekir).

Filtrelere baktığımızda her şey yerli yerine oturdu. CP1251, KOI8-R'den ayırt edilemez. Genel olarak ISO-8859-5, kodlamalar listesindeyse, her zaman doğru olarak algılanacaktır.

Genel olarak, başarısız olun. Anlaşılabilir - yalnızca karakter kodlarıyla, bu kodlar farklı kodlamalarda kesiştiğinden, genel durumda kodlamayı bulmak imkansızdır.

2. Google ne verir

Ve Google her türlü pisliği veriyor. Buraya kaynağı da yazmayacağım, isterseniz kendiniz görün (http://'den sonraki boşluğu kaldırın, metni link olarak değil nasıl göstereceğimi bilmiyorum):

http://deer.org.ua/2009/10/06/1/
http://php.su/forum/topic.php?forum=1&topic=1346

3. Haber arama

1) tekrar karakter kodları: habrahabr.ru/blogs/php/27378/#comment_710532

2) bence çok ilginç bir çözüm: habrahabr.ru/blogs/php/27378/#comment_1399654
Bağlantıdaki yorumlarda artıları ve eksileri. Şahsen, bu çözümün yalnızca kodlama tespiti için gereksiz olduğunu düşünüyorum - çok güçlü olduğu ortaya çıkıyor. İçindeki kodlamanın tanımı - bir yan etki olarak).

4. Aslında benim kararım

Fikir, önceki bölümdeki ikinci bağlantıyı görüntülerken ortaya çıktı. Fikir şu: Büyük bir Rusça metin alıyoruz, farklı harflerin frekanslarını ölçüyoruz ve bu frekansları kodlamayı tespit etmek için kullanıyoruz. İleriye baktığımda, büyük ve küçük harflerle ilgili sorunlar olacağını hemen söyleyeceğim. Bu nedenle, hem büyük/küçük harfe duyarlı hem de olmayan harf frekansı örnekleri (haydi “spektrum” diyelim) gönderiyorum (ikinci durumda, aynı sıklıkta küçük harfe daha da büyük bir harf ekledim ve tüm büyükleri sildim) . Bu "spektra"da, frekansları 0,001'den küçük olan tüm harfler ve bir boşluk kesilir. "Savaş ve Barış"ı işledikten sonra elde ettiklerim:

Büyük/küçük harfe duyarlı "spektrum":
dizi ("o" => 0.095249209893009, "e" => 0.06836817536026, "a" => 0.067481298384992, "u" => 0.055995027400041, "n" => 0.0522427944063325, .... "02. " => 0.0021318391371162, " П" => 0.0018574762967903, "ф" => 0.0015961610948418, "В" => 0.0014044332975731, "О" => 0.0013188987793209, "A" => 0.0012623590130186, "K" => 0.0011804488387602, "М" => 0.00,106)

Büyük/küçük harfe duyarsız:
dizi ("О" => 0.095249209893009, "о" => 0.095249209893009, "Е" => 0.06836817536026, "е" => 0.06836817536026, "А" => 0.067481298384992, "а" => 0.067481298384992, "И" => 0.055995027400041 , "ve" => 0.055995027400041, .... "c" => 0.0029893589260344, "c" => 0.0029893589260344, "Ф" => 0.0024649163501406, "C" => 0.0024649163501406, "E" => 0.002228922222 " => 0.002252892226507 , "Ф" => 0.0015961610948418, "Ф" => 0.0015961610948418,)

Farklı kodlamalardaki spektrumlar (dizi tuşları - karşılık gelen kodlamada karşılık gelen karakterlerin kodları):

Daha öte. Bilinmeyen bir kodlamanın metnini alıyoruz, kontrol ettiğimiz her kodlama için mevcut karakterin frekansını buluyor ve bu kodlamayı "derecelendirmeye" ekliyoruz. En yüksek derecelendirmeye sahip kodlama, büyük olasılıkla metin kodlamasıdır.

$encodings = array("cp1251" => "specter_cp1251.php" gerektirir, "koi8r" => "specter_koi8r.php" gerektirir, "iso88595" => "specter_iso88595.php" gerektirir); $enc_rates = dizi(); için ($i = 0; $i< len($str); ++$i) { foreach ($encodings as $encoding =>$char_specter) ( $enc_rates[$encoding] += $char_specter)]; ) var_dump($enc_rates);
Bu kodu kendi başınıza çalıştırmayı denemeyin bile - işe yaramaz. Bunu sözde kod olarak düşünebilirsiniz - Makaleyi dağıtmamak için ayrıntıları atladım. $char_specter, yalnızca pastebin'de başvurulan dizilerdir.

Sonuçlar
Tablonun satırları metin kodlamasıdır, sütunlar $enc_rates dizisinin içeriğidir.

1) $str = "Rusça metin";
0.441 | 0.020 | 0.085 | Windows-1251
0,049 | 0.441 | 0.166 | KOI8-R
0.133 | 0.092 | 0.441 | ISO-8859-5

Her şey harika. Gerçek kodlama zaten diğerlerinden 4 kat daha yüksek derecelendirmeye sahip - bu çok kısa bir metinde. Daha uzun metinler için oran yaklaşık olarak aynı olacaktır.


cp1251 | koi8r | iso88595 |
0.013 | 0.705 | 0,331 | Windows-1251
0,649 | 0.013 | 0,201 | KOI8-R
0,007 | 0,392 | 0.013 | ISO-8859-5

Eyvah! Tam yulaf lapası. Çünkü CP1251'deki büyük harfler genellikle KOI8-R'deki küçük harflere karşılık gelir. Ve küçük harfler, büyük harflerden çok daha sık kullanılır. Bu yüzden CP1251'deki büyük harf dizisini KOI8-R olarak tanımlıyoruz.
Bunu büyük/küçük harfe duyarsız yapmaya çalışmak (“spektra” büyük/küçük harfe duyarsız)

1) $str = "Rusça metin";
cp1251 | koi8r | iso88595 |
0,477 | 0,342 | 0.085 | Windows-1251
0,315 | 0,477 | 0,207 | KOI8-R
0,216 | 0,321 | 0,477 | ISO-8859-5

2) $str = "STRING CAPSOM RUSÇA METİN";
cp1251 | koi8r | iso88595 |
1.074 | 0.705 | 0,465 | Windows-1251
0,649 | 1.074 | 0,201 | KOI8-R
0,331 | 0,392 | 1.074 | ISO-8859-5

Gördüğünüz gibi, doğru kodlama tutarlı bir şekilde hem büyük/küçük harfe duyarlı "spektra" (dize az sayıda büyük harf içeriyorsa) hem de büyük/küçük harfe duyarlı olmayanlarla devam eder. İkinci durumda, büyük/küçük harfe duyarsız olanlarda, lider elbette o kadar emin değildir, ancak küçük dizilerde bile oldukça kararlıdır. Harflerin ağırlıklarıyla oynayabilirsiniz - örneğin, onları frekansa göre doğrusal olmayan hale getirin.

5. Sonuç

Konu UTF-8 ile çalışmayı kapsamıyor - burada karakter kodlarını almanın ve dizeyi karakterlere bölmenin biraz daha uzun / daha karmaşık olması dışında temel bir fark yoktur.
Bu fikirler elbette sadece Kiril kodlamalarına değil, elbette - soru sadece ilgili dillerin / kodlamaların "spektrumunda".

not Çok gerekli/ilginçse, tam olarak çalışan bir kütüphanenin ikinci bölümünü GitHub'da yayınlayacağım. Postadaki verilerin böyle bir kütüphaneyi hızlı bir şekilde yazmak ve kendi ihtiyaçlarınızı karşılamak için oldukça yeterli olduğuna inansam da - Rus dili için "spektrum" düzenlenmiştir, gerekli tüm kodlamalara kolayca aktarılabilir.

Aniden basit bir komut dosyası çalışmayı durdurdu. Komut dosyasının görevi bir HTML sayfası (bir tarayıcı oyunundan) almak ve normal ifadeler kullanarak verileri getirmektir. Yeni başlayan biri olarak benim için bu olay şaşkınlığa ve hafif bir paniğe neden oldu: sonuçta dün her şey hala çalışıyordu! Sorun ne?
Bazı PHP işlevlerinin çalışmasını iyice anlamam gerekiyordu.

Kod oldukça ilkeldi:

$desen = ; $url = "http://www.heroeswm.ru/pl_info.php?id=($id)"; $html = file_get_contents ($url); preg_match ($desen, $html, $eşleşmeler); if (isset ($matches[1])) echo $matches[1]; else echo "bulunamadı";

$pattern = "#Bir harf yaz(.*)Savaş seviyesi#is"; $url = "http://www.heroeswm.ru/pl_info.php?id=($id)"; $html = file_get_contents($url); preg_match($desen, $html, $eşleşme); if (isset($eşleşir)) echo $eşleşir; else echo "bulunamadı";

Basit bir düzenli ifade ile veri alma ve ayrıştırma.
Bu kodun ufak bir değişikliğin sonucu olduğunu söylemeliyim. Orijinal sürümde, normal ifade HTML etiketlerini aradı. Ama şimdi Rusça iki cümle arasında bir parça bulmam gerekiyordu. Arama şablonuna Rusça kelimeler ekledim ve kritik olan bu değişiklik oldu.

Ve şimdi sırayla.
Oyun sitesi www.heroeswm.ru kodlamada sayfalar veriyor kazanmak-1251. sunucumda kodlama var UTF-8, yani tüm komut dosyaları UTF-8 BOM'suz.
HTML etiketleriyle arama içeren orijinal komut dosyası, kodlamalardaki farklılığa rağmen doğru çalıştı, ancak arama şablonuna Kiril karakterleri eklediğimde aramayı ve bulmayı bıraktım. Benim görevimde, sorunu bir kenara bırakıp farklı bir şablon seçmek çok kolay olurdu - Rusça kelimeler olmadan, ancak çoğu durumda bu imkansızdır. Bu yüzden doğru yapmaya karar verdim: kodlamalar arasındaki temel fark nedir neden arıyor düzenli ifadelerin yanlış çalışması, ve aynı zamanda hangi işlevler etkilenir kodlamalardaki fark ve bunun nasıl aşılacağı nedeniyle.

Verileri almak için aşağıdaki sözdizimine sahip file_get_contents() işlevini kullandım:

sicim file_get_contents( sicim$dosyaadı), burada $dosyaadı okunan dosyanın adıdır.
Veriler başarıyla alınmadıysa, bir dize veya bool(false) döndürür.

En belirgin kodlama farkı kazanmak-1251 ve UTF-8 onların yardımı ile kodlanabilen karakter sayısıdır. Her karakter bir bayt ile kodlandığından, ilki (ve benzeri) yalnızca 255'e tabidir.

İkincisinin yardımıyla, ulusal alfabelerin harfleri, Arap harfleri ve hiyeroglifler dahil olmak üzere gerçekten çok büyük bir karakter dizisini aktarabilirsiniz. Karakter kümesinin böyle bir genişlemesi, karakterlerin bir değil, iki (çoğu karakter için) veya daha fazla (dört adede kadar) bayt ile kodlanması nedeniyle elde edilir. Bu nedenle kodlama UTF-8(ve benzerleri), tek baytlı olanların aksine, çok baytlı veya çok baytlı olarak adlandırılır. kazanmak-1251.

Bu kadar geniş bir işaret kümesiyle, UTF-8 bir sitede yalnızca farklı alfabelerdeki harflerin kullanılmasına izin vermekle kalmayacak, aynı zamanda Kiril destekli kodlamaların varlığında bile Rusça sitenin doğru görüntüleneceğine dair kesin bir garanti verecektir ( kazanmak-1251, KOI8-R, CP866, ISO 8859-5 vb.) şüphelenmeyin: Japonya, Kore, Arap ülkeleri vb. Bu çok yönlülüğün fiyatı, depolama sırasında biraz daha fazla karakter ağırlığı ve buna bağlı olarak dize işlevleriyle işlenmesi için daha uzun bir süre olacaktır. PHP. Bu arada, çoğu durumda düzgün çalışmayacaklar. Karşılaştığım sorun şuydu: bir komut dosyasının normal ifadesi UTF-8, siteden elde edilen sayfada Kiril karakterleri de dahil olmak üzere ihtiyacım olan alt dizeyi doğru bir şekilde bulamadım. Windows-1251.

Yalnızca Kiril ve Latin alfabelerini kullanacak sitelerin UTF-8 hiçbir şeye ve kabul edilen basit ayrıştırıcı oldukça iyi "yaşadı" kazanmak-1251, ancak bu kodlamalarla arkadaş olmanın ve dize işlevlerini kullanmanın gerekli olmadığı durumlar vardır. PHPörneğin, bir proje geliştirirken dışarı çıkmayın UTF-8.

Dize işlevlerinin yanlış davranışına ne sebep oldu?

Daha önce de belirtildiği gibi, kodlamalar arasındaki temel fark, karakterlerin uzunluğudur. Bu nedenle, baytlarla olduğu gibi karakterlerle çalıştıkları işlevleri kullanırken sorunlar ortaya çıkar ve değerler de bayt olarak döndürülür (bu, tek baytlık bir kodlama için geçerlidir: bir karakter bir bayta eşittir).

Örneğin, işlev

substr ("Kontrol et" , 0 , 5 ) ; // UTF-8 kodlamasındaki metin

substr("Kontrol", 0, 5); // UTF-8 kodlamasındaki metin

beklenen "Kanıt" yerine "Pr�" döndürür: UTF-8 Kiril karakterleri iki bayt olarak kodlanmıştır, bunun sonucunda “krakozyabr” görüyoruz - “o” karakterinin yalnızca ilk baytı.

Bu nedenle, çoğu durumda, dizelerle çalışmak için UTF-8özel işlevlerin kullanılmasını gerektirecektir (örneğin, uzantıdan PHP veri dizisi) ve bazen her ikisi de (örneğin, HTTP başlığında dizenin boyutunu bayt olarak iletmek için strlen() öğesini bırakmanız ve karakter sayısını saymak için mb_strlen() eklemeniz gerekir).

Bir uzantıdaki işlevlerle değiştirilmesi gerekebilecek sık kullanılan işlevlerin sözdizimi PHP mbDizesi:

int strlen( sicim$string) - Dizenin uzunluğunu veya dize boşsa 0 değerini döndürür.

int strpos( sicim$samanlık, karışık$needle) - $haystack alt dizesinde $needle dizesinin ilk oluşumunun konumunu döndürür veya YANLIŞ bulunmazsa.

stripos önceki işleve benzer, yalnızca arama büyük/küçük harfe duyarlı değildir.

sicim substr( sicim$dize , int$başlangıç [, int $uzunluk ]) - belirtilen karakter konumundan başlayarak ve üçüncü parametreyi belirlerken - belirli bir uzunluk olan bir alt dize seçmenize olanak tanır.

Analogları çok baytlı kodlamalarda çalışmak üzere tasarlanmıştır: mb_strlen , mb_strpos , mb_stripos ve mb_substr .

Tabii ki, metinle çalışmak için daha birçok işlev var. Ben sadece en popüler olanları ekledim.

Normal bir ifadeyle belirtilen maskeyle eşleşen bir alt dizeyi (alt dizeleri) aramak için tasarlanmış normal ifadelerle çalışma işlevleri birbirinden farklıdır.

int preg_match( sicim$desen , sicim$konu , dizi&$eşleşir)

int preg_match_all( sicim$desen , sicim$konu dizi&$eşleşir) .

$konu metni, normal ifade tarafından belirtilen $pattern ile eşleştirilir. Arama sonucu $matches değişkenine yazılır. İşlev, kalıpla bulunan eşleşme sayısını döndürür, bir hata olması durumunda geri döner. YANLIŞ.

Kalıp eşleştirme için çok baytlı kodlamalarda düzenli ifadeler kullanmak için, bunlara /u değiştiricisini eklemeniz veya mb_ereg* işlev grubunu kullanmanız gerekir.

Ne yapalım?

İlk gelen çözüm, yeniden kodlamaktır. UTF-8 alınan kazanmak-1251 veri - uygunsuz görünüyordu. Sonuçta, kayıttan sonra, tüm sıradan işlevlerin, çalışmak için özel olanlarla değiştirilmesi gerekecektir. UTF-8 veya /u değiştiricisini kullanmayı deneyin (ileriye bakınca, tek baytlık kodlamalarda dizelerle çalışmanıza izin verdiğini söyleyeceğim, "dizelerle olduğu gibi UTF-8', ancak dizeler için uygun değildir UTF-8). Örneğimde sadece bir preg_match() var, ancak pratikte bu nadiren oluyor.

Bu yüzden sorunu tersine çeviriyorum: Normal preg_match() işlevlerini kullanmak istiyorum ve bunun için gelen dizgiyi değil, iconv() kullanarak arama modelini yeniden kodlayacağım.

İşlev sözdizimi:
sicim iconv($in_charset, $out_charset, $str) - $str dizesini $in_charset kodlamasından $out_charset kodlamasına dönüştürür. Orijinal değişkeni etkilemeden kaydedilen metni döndürür.

İşlev yeni kodlamada bir dize döndürür, ancak dizenin kendisinin kodlamasını değiştirmez. Bu yüzden

$pattern = "#Bir harf yaz(.*)Savaş seviyesi#is"; iconv("UTF-8", "WINDOWS-1251", $desen); // $pattern orijinal kodlamada kalır preg_match($pattern, $html, $matches);

çalışmayacak - $pattern orijinal kodlamada kaldı UTF-8. iconv sonucunu bir değişkene atamanız gerekir:

$desen = "#Bir harf yaz(.*)Savaş seviyesi#is"; $desen = iconv("UTF-8" , "WINDOWS-1251" , $desen ) ; preg_match ($desen, $html, $eşleşmeler);

$pattern = "#Bir harf yaz(.*)Savaş seviyesi#is"; $desen = iconv("UTF-8", "WINDOWS-1251", $desen); preg_match($desen, $html, $eşleşme);

Şimdi arama düzgün çalışıyor, ancak tarayıcıya yalnızca sağlam krakozyabry veriyor. Pekala, burada ne yapacağımı zaten biliyorum: sonucu çalışan bir kodlamaya yeniden kodlamanız gerekiyor UTF-8. Ve sonra, benim için açık olmayan ikinci nokta ortaya çıktı, ancak daha fazla deneyimim olsaydı, muhtemelen zorluklara neden olmazdım: iconv () neden bazı değişkenleri yeniden kodluyor, ancak diğerlerini değil?

$matches değişkeni bir dizidir ve iconv($matches) dosyasının bir kaydından kurtulmaya çalıştım. Bir kez daha fonksiyon sözdiziminin tanımına bakıyorum: elbette, tüm parametreler diziler değil, dizeler olmalıdır. Yani yeniden kodlanması gereken tüm dizi değerlerinin üzerinden geçilerek istenilen kodlamaya dönüştürülmesi gerekmektedir. Örneğimde, diziyi yinelemedim çünkü tüm diziyle değil tek bir değerle ilgileniyordum. Bunu iconv() fonksiyonunun bir parametresi olarak belirttim.

İşte bitirdim:

// varsayılan kodlamayı ayarla setlocale(LC_ALL, "ru_RU.UTF-8" ) ; başlık( "İçerik türü: metin/html; karakter kümesi=UTF-8") ; $desen = "#Bir harf yaz(.*)Savaş seviyesi#is"; $desen = iconv("UTF-8" , "WINDOWS-1251" , $desen ) ; $url = "http://www.heroeswm.ru/pl_info.php?id=993353"; $html = file_get_contents ($url); preg_match ($desen, $html, $eşleşmeler); if (isset ($matches[1])) echo $matches[1] = iconv ("WINDOWS-1251", "UTF-8", $matches[1]); else echo "bulunamadı"; ?>

Yazı yakın arkadaşım tarafından yazılmıştır. Metin yazmak ve kontrol etmekle meşgul, PHP'de programlama daha çok hobisi. Blogumda, tüm yayınları düzeltiyor ve bu da blogun 2. yıl dönümü için bana hediyesiydi.

Benzer yayın bulunamadı.

Önceki derslerde oluşturduğumuz HTML sayfamıza geri dönelim ve şimdi metninin saklanacağı kodlamayı ayarlayalım.

Metin kodlamasını nasıl değiştirebileceğinizin iki yolundan bahsetmek istiyorum. Kural olarak, onları pratikte kullanıyorum ve kendilerini iyi kanıtladılar.

Metin kodlamasını değiştirmenin en güvenilir yolu Notepad++ kullanmaktır. Kural olarak, bu yöntem her zaman güvenilir bir şekilde çalışır ve en zor sorunları çözmek için kullanılabilir.

1 yol. Not Defteri++ Kullanımı

Bu nedenle, metin kodlamasını değiştirmek için notepad ++ adlı özel bir metin düzenleyiciye ihtiyacımız var.

Ücretsizdir ve bu siteden indirilebilir:

Bu programı kullanarak HTML sayfasını açın ve "Kodlamalar" ana menüsüne gidin.

Dosyayı dönüştürmek ve kaydetmek istediğiniz kodlamayı seçin.

Bütün prosedür bu. Program çok iyi ve diğer alternatiflerin aksine kodlamayı hatasız değiştiriyor.

2 yol. Evrensel kod düzenleyici Dreamweaver'ı kullanma.

Dreamweaver'ın evrensel kod düzenleyicisinde çalışıyorsanız, metnin oluşturulacağı kodlamayı belirtme seçeneği de vardır.


Bunu ayrıca "Düzenle - Sayfa Özellikleri" ana menüsünü kullanarak da yapabilirsiniz.


Ardından, "Ad / Kodlama" kategorisinde ihtiyacınız olan kodlamayı seçin. Çoğu zaman bu, Unicode kodlaması (UTF-8) olacaktır.

Yeni bir html belgesi oluştururken bu yöntem işe yarar, ancak mevcut bir dosyanın kodlamasını değiştiriyorsanız, ilk yöntemi kullanmak daha iyidir. Bu durumda, daha iyi çalışır.

Bu işlemi bilgisayarınızda yapın.

Ancak, html sayfası için metin kodlamasını belirtmek yeterli değildir. Normal çalışması için bir şey daha yapmanız gerekir: tarayıcıya metnin hangi kodlamada yazıldığını söyleyin.