PHP, MSSQL2005 ve Codepages

3 Cevap php

Ben, bir MSSQL2005 veritabanına erişir ondan bazı verileri okur ve bir posta sonuçlarını gönderir bir php komut dosyası var.

Hem bazı sütun isimleri ve alanlarında kendisi özel karakter vardır.

When I access the script through my browser (webserver iis), the query is executed correctly and the contents of the mail are correctly (for my audience) encoded. However, when I execute php from the console, the query fails (due to the special characters in the column names). If I replace the special characters in the query with calls to chr() and the character code in latin-1, the query gets executed correctly, but the results are also encoded in latin-1 and therefore not displayed correctly in the mail. Why is PHP/the MSSQL driver/… using a different encoding in the two scenarios? Is there a way around it?

Eğer merak ediyorsanız ben SQLAgent (veya taskmanager veya ne olursa olsun) kullanarak komut zamanlama istiyorum çünkü, ben konsol lazım.

3 Cevap

Eğer veritabanında var karakterlerin türüne bağlı olarak, sanırım bir konsol sınırlama olabilir. Eğer konsol chcp yazarsanız, gibi bir şey CP437 da Genişletilmiş ASCII olarak bilinen olabilir Etkin kod sayfası, ne olduğunu görürsünüz. UTF8 gibi bu kod sayfası, dışarı karakterler varsa, sorunlarla olabilir. Sen chcp 65001 UTF8 geçmek için yazarak geçerli etkin kod sayfasını değiştirebilirsiniz.

Ayrıca tüm fontları genişletilmiş karakterleri (sağ komut istemi penceresinin başlığı, özellikleri, yazı üzerine tıklayın) destek olarak gerekli karakter bağlı olarak Lucida Console için varsayılan Raster yazı tipini değiştirmek isteyebilirsiniz.

Zaten PHP'nin unicode desteği ideal değildir, ama utf8_decode birkaç iyi yerleştirilmiş işlev çağrısı ile PHP5 bunu yönetebilir, dedi. PHP değişkeni veritabanı, veritabanı bağlantısı, mevcut bayt, konsol ekrana çıktı, lütfen e-posta vücut: karakter kodlaması sırrı kullandığınız all araçları Geçerli kodlama ne olduğunu iyi anlamak için kodlama, e-posta istemcisi, vb ...

Özel karakter var, her şey için modern günlerde, UTF8 gibi bir şey sık sık tavsiye edilir. Emin yol boyunca her UTF8 için ayarlanmış olduğundan emin olun ve sadece gerektiğinde dönüştürmek.

İngilizce olmayan dünya için PHP'nin yoksul desteği iyi bilinmektedir. Ben temel ASCII bölge dışındaki karakterler ile bir veritabanı asla kullanmadım, ama belli zaten etrafında bir iş var ve bunu sadece onunla yaşamak zorunda gibi görünüyor.

If you wanted to take it a step further, you could: 1. Write an array that contains all the special chars and their CHR equivalents 2. foreach the array and str_replace on the query

Sorgu kodlanmış Ama eğer, ben ne var gayet iyi sanırım. Ayrıca, orada bu sabit bir değişim her zaman var ama ben 4.xx sürüm notlarını yağsız ve ben senin sorununa ilişkindir şey görmüyorum, sen, en azından 4.4.x son PHP kullandığınızdan emin olun.

PHP dizeleri hakkında hatırlanması gereken şey, bayt akışları olmasıdır. Eğer (sen ne yapıyorsun için) doğru karakter kümesi veri almak istiyorsanız, işlev veya filtre çeşit yoluyla açıkça bunu yapmak zorunda. Tüm oldukça düşük seviyede.

Ayarlarınıza bağlı olarak, veritabanında dizeleri iç karakter kümesi bilmeniz gerekebilir, ama en azından bunu sadece bir dere var PHP, hatırlıyorum, çünkü veritabanı (PHP gönderiyor ayarlamak ne karakter bilmek gerekir bayt).

Sonra hedef karakter kümesi (ve muhtemelen bunu belirtmek, gerçekten zaten gerektiği) bilmek zorunda. Örneğin, veritabanından utf-8 alıyorsanız söylüyorlar, ama bir latin-1 göndermek (ve dolayısıyla base64 veya q-yazdırılabilir 'Content-transfer-encoding' olarak kodlanmış) istiyoruz:

$send_string = base64_encode(utf8_decode($database_string));

Tabii ki bu durumda, tüm utf-8 karakterler latin-1 karakter seti var, ve muhtemelen gerçekten PHP ne yazık ki iyi bir q-yazdırılabilir kodlama fonksiyonu yoktur (base64 istemem bilmek olurdu , merakla olsa,) kod çözme için yapar, ve utf-8 bahsetmiyoruz eğer <=> latin-1 yerine mbstring işlevlerini dışarı kırbaç isteyeceksiniz.

Bildiğim kadarıyla konsolu olarak, size muhtemelen kabuk ve / veya PHP ayarlarına bağlıdır konsolundan, özel karakterleri yazarken PHP oluyor bilmek olurdu. Ama PHP sadece byte byte byte olarak dizeleri anlar ve bunu atlatmanın mümkün olması gerektiğini unutmayın.