Özel karakterler ile ilgili sorunlar - UTF-8 metin dosyaları içine MySQL metin alanları Kodlama

5 Cevap php

Adobe InDesign iç biçimlendirme için biçimlendirilmiş bir. Txt dosyasına MySQL veritabanı satırları ihracat bir php komut dosyası yazıyorum.

İhracat iş, ama ben é veya umlauts gibi özel karakterleri karşılaştığınızda, ben garip semboller olsun (örneğin, Chloë Hanslip yerine Chloë Hanslip). Arayacaksınız ve her türlü tuhaf karakter için değiştirmek yerine, daha iyi bir yöntem gerekir.

Ben metin veritabanı çarptığında, düzgün kaydedildiği kontrol ettim - veritabanındaki ben özel karakter görmek. Benim ihracat kod temelde InDesign kod etiketleri koymak için bazı düzenli ifadeler çalışır, ve ben garip sembolleri ile sol. Ben sadece çıkış, düzgün (yerine bir metin dosyası indirmek için istemine göre) tarayıcıya metin görüntüler. Ben dosyayı kaydedin ben bu kodu kullanabilirsiniz:

header("Content-disposition: attachment; filename=test.txt");

header("Content-Type: text/plain; charset=utf-8");

Ben boşuna utf8_encode() ve iconv() çeşitli kombinasyonları denedim. Herkes burada bana doğru yönde işaret edebilir?

5 Cevap

InDesign başlığında belirtilen herhangi bir kodlama kullanmak mümkün olmaz. (Hatta Windows diske kaydetmek zaman tutulur değil gibi, görmek olmaz.) Yerine açıkça bunu gibi dosyanın başında kendi özel etiketi kodlama, söylemek zorundayım:

<ANSI-WIN>

Ne yazık ki, o does not use standard encoding names ve InDesign o tüm UTF-8 kodlama karşılık anlayan hiçbir etiketi yoktur. Bunu istediğiniz herhangi bir karakter eklemek sağlayacak kullanabileceğiniz tek kodlama etiketi:

<UNICODE-WIN>

Hangi Windows CRLF satır sonları, UTF-16 (BOM ile küçük-endian) karşılık gelir. (Seçeneği biten sadece diğer çizgi karakteri biten hat CR oldu eski okul öncesi OSX Mac'ler olarak size hiç istemediğiniz, MAC.)

Yani, veritabanı ve ova (Unix-Linux-OSX-web-tarzı) LF newlines çıkardı ettik UTF-8 bayt dizileri dahil bir UTF-8 dizesi $ ler göz önüne alındığında, bu gibi yazmak isterim:

$s= "<UNICODE-WIN>\r\n".str_replace("\n", "\r\n", $s);
echo iconv('UTF-8', 'UTF-16', $s);

(Sağlanması değil çıkışı bu UTF-16 kodlaması kırarım çünkü önce veya sonra any boşluk için.

İhracat önce değişim iletim örneğin bir kodlama için SET NAMES komutunu kullanabilirsiniz:

SET NAMES utf8;

Eğer mysql backuper yazılım bu yapılandırabilirsiniz.

Sadece PHP aramak DB bağlantı yöntemlerinden sonra mysql_set_charset('utf8');

ISO-8859-1 dize UTF-8 olarak gönderilir gibi görünüyor ...

Lütfen table and fields UTF-8 olup da UTF-8 veritabanına bağlanmak emin olun. Tüm bilgisayarlar için varsayılan yapılandırmasını şu yüzden kullandım - masa ve alanları UTF-8 iseniz ve MySQL charset belirtmek istemiyorsanız, MySQL ISO-8859-1 (latin1) için sinek verilere dönüştürür far ...

Bu benim (PHP 5.2.2 ve daha az geri uyumlu) bunu yapmak için kullanabileceğiniz bir yoldur:

$conn = mysql_connect('localhost', 'user', 'pass');
mysql_select_db('dbname');
if (mysql_errno())
{
    //Handle database connection error here
}

if (function_exists('mysql_set_charset'))
    mysql_set_charset('utf8', $conn); //PHP 5.2.3+ only
else
{
    if (mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $conn) === false)
    {
        //Unable to set database charset! Handle error here...
    }
}

sonra UTF-16 dönüştürme - Bu, benim metin editörü sadece kareler olarak görüntülenen bir dosya sonuçlandı

iconv BOM \ xff \ XFE Unicode dosyasının başında yer alınması gerektiğini bayt eklemek olmayabilir.

Try this one: $out = "\xff\xfe" . iconv('UTF-8','UTF-16LE',$out);